Conjunto de filters swift de cadenas

He tenido problemas para filtrar la matriz de palabras key (cadenas) en swift, Mi código:

self.filtenetworkingKeywords=filter(keywords.allValues, {(keyword:NSString) -> Bool in let words=keyword as? NSString return words?.containsString(searchText) }) 

Como AnyObject no puede ser un subtipo de NSString , ¡estoy atrapado con esto!

[Actualizado para Swift 2.0]

Como NSString está NSString a Swift String , simplemente evite las coacciones con:

  3> ["abc", "bcd", "xyz"].filter() { nil != $0.rangeOfString("bc") } $R1: [String] = 2 values { [0] = "abc" [1] = "bcd" } 

Pero, si crees que allValues no son cadenas:

 (keywords.allValues as? [String]).filter() { nil != $0.rangeOfString("bc") } 

que devuelve una matriz opcional.

Su filter ha terminado [AnyObject] , pero su cierre toma NSString . Estos deben coincidir. Además, su resultado debe ser un Bool , no un Bool? . Puede abordar estos simplemente de esta manera:

 self.filtenetworkingKeywords = filter(keywords.allValues, { let keyword = $0 as? NSString return keyword?.containsString(searchText) ?? false }) 

Esto acepta AnyObject y luego intenta obligarlo a NSString . Entonces nil-coalleces ( ?? ) el resultado para asegurarse de que siempre sea un Bool .

Sin embargo, recomiendo tratar keywords como [String:String] lugar de un NSDictionary . Eso eliminaría todas las complicaciones de AnyObject . Entonces puedes hacer esto:

 self.filtenetworkingKeywords = keywords.values.filter { $0.rangeOfString(searchText) != nil } 

Siempre que sea posible, convierta las collections de la Fundación en collections Swift tan pronto como pueda y guárdelas. Si tiene objects entrantes de Fundación, generalmente puede convertirlos fácilmente con técnicas como:

 let dict = nsdict as? [String:String] ?? [:] 

O puede hacer lo siguiente para convertirlos de modo que se bloqueen en debugging (pero silenciosamente "funcionan" en la versión):

 func failWith<T>(msg: String, value: T) -> T { assertionFailure(msg) return value } let dict = nsdict as? [String:String] ?? failWith("Couldn't convert \(d)", [:]) 

Hay un problema con la respuesta de GoZoner para ciertos types de datos y también una forma un poco mejor de hacerlo. Los siguientes ejemplos pueden mostrar esto:

 let animalArray: NSMutableArray = ["Dog","Cat","Otter","Deer","Rabbit"] let filtenetworkingAnimals = animalArray.filter { $0.rangeOfString("er") != nil } print("filtenetworkingAnimals:", filtenetworkingAnimals) filtenetworkingAnimals: [Dog, Cat, Otter, Deer, Rabbit] 

¡Probablemente no sea el set que esperabas!

Sin embargo, esto funciona bien de esta manera si no escribimos animalArray como NSMutableArray :

 let animalArray = ["Dog","Cat","Otter","Deer","Rabbit"] let filtenetworkingAnimals = animalArray.filter { $0.rangeOfString("er") != nil } print("filtenetworkingAnimals:", filtenetworkingAnimals) filtenetworkingAnimals: [Otter, Deer] 

Sin embargo, recomiendo usar $ 0.contains () en lugar de $ 0.rangeOfString ()! = Nil porque funciona en ambas circunstancias y mejora ligeramente la legibilidad del código:

 let animalArray: NSMutableArray = ["Dog","Cat","Otter","Deer","Rabbit"] let filtenetworkingAnimals = animalArray.filter { $0.contains("er") } print("filtenetworkingAnimals:", filtenetworkingAnimals) filtenetworkingAnimals: [Otter, Deer]