Swift 2: matriz de filters de cadenas, incluida la condición "similar"

No pude encontrar la solución de syntax Swift 2 para esto.

Si mi matriz principal es ["Hello","Bye","Halo"] , y estoy buscando "lo" , filtrará la matriz solo a ["Hello", "Halo"] .

Esto es lo que he intentado:

  let matchingTerms = filter(catalogNames) { $0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch) != nil } 

Lanza

 Type of expression is ambiguous without more context 

¿Alguna sugerencia?

Use containsString lugar:

 let arr = ["Hello","Bye","Halo"] let filtenetworking = arr.filter { $0.contains("lo") } print(filtenetworking) 

Salida

["Hola", "Halo"]

Gracias a @ user3441734 por señalar que esa funcionalidad solo está disponible cuando import Foundation

En Swift 3.0

 let terms = ["Hello","Bye","Halo"] var filterdTerms = [String]() func filterContentForSearchText(searchText: String) { filterdTerms = terms.filter { term in return term.lowercased().contains(searchText.lowercased()) } } filterContentForSearchText(searchText: "Lo") print(filterdTerms) 

Salida

 ["Hello", "Halo"] 

También debe comparar con NSNotFound. La documentation de rangeOfString: options: dice:

Una estructura NSRange que da la location y la longitud en el receptor de la primera aparición de aString, modula las opciones en máscara. Devuelve {NSNotFound, 0} si aString no se encuentra o está vacío (@ "").

 import Foundation let catalogNames = [ "Hats", "Coats", "Trousers" ] let matchingTerms = catalogNames.filter { $0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch).location != NSNotFound } 

con la ayuda de la extensión String puede usar la solución pura Swift (sin importar Foundation). No comprobé la velocidad, pero no debería ser peor como la base equivalente.

 extension String { func contains(string: String)->Bool { guard !self.isEmpty else { return false } var s = self.characters.map{ $0 } let c = string.characters.map{ $0 } repeat { if s.startsWith(c){ return true } else { s.removeFirst() } } while s.count > c.count - 1 return false } } let arr = ["Hello","Bye","Halo"] let filtenetworking = arr.filter { $0.contains("lo") } print(filtenetworking) // ["Hello", "Halo"] "a".contains("alphabet") // false "alphabet".contains("") // true 

mi bash …

 let brands = ["Apple", "FB", "Google", "Microsoft", "Amazon"] let b = brands.filter{(x) -> Bool in (x.lowercased().range(of: "A".lowercased()) != nil) } print(b) //["Apple", "Amazon"] 

Swift 3.1

 let catalogNames = [ "Hats", "Coats", "Trousers" ] let searchCatalogName = "Hats" let filtenetworkingCatalogNames = catalogNames.filter { catalogName in return catalogName.localizedCaseInsensitiveContains(searchCatalogName) } print(filtenetworkingCatalogNames)