Si mon tableau principal est ["Hello","Bye","Halo"]
, et je cherche "lo"
, il filtrera le tableau uniquement pour ["Hello", "Halo"]
.
C'est ce que j'ai essayé:
let matchingTerms = filter(catalogNames) {
$0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch) != nil
}
Il jette
Type of expression is ambiguous without more context
Aucune suggestion?
Utilisez contains
à la place:
let arr = ["Hello","Bye","Halo"]
let filtered = arr.filter { $0.contains("lo") }
print(filtered)
Sortie
["Bonjour", "Halo"]
Merci à @ user3441734 pour avoir signalé que cette fonctionnalité n’est bien entendu disponible que lorsque vous import Foundation
In 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)
Sortie
["Hello", "Halo"]
Swift 3.1
let catalogNames = [ "Hats", "Coats", "Trousers" ]
let searchCatalogName = "Hats"
let filteredCatalogNames = catalogNames.filter { catalogName in
return catalogName.localizedCaseInsensitiveContains(searchCatalogName)
}
print(filteredCatalogNames)
mon essai ...
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"]
Vous devez également comparer à NSNotFound. La documentation de rangeOfString: options: dit:
Une structure NSRange donnant l'emplacement et la longueur dans le récepteur de la première occurrence de aString, modulo les options du masque. Renvoie {NSNotFound, 0} si une chaîne n'est pas trouvée ou est vide (@ "").
import Foundation
let catalogNames = [ "Hats", "Coats", "Trousers" ]
let matchingTerms = catalogNames.filter {
$0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch).location != NSNotFound
}
avec l’aide de String extension, vous pouvez utiliser la solution pure Swift (sans Import Foundation)). Je n’ai pas vérifié la vitesse, mais son équivalent ne devrait pas être pire.
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 filtered = arr.filter { $0.contains("lo") }
print(filtered) // ["Hello", "Halo"]
"a".contains("alphabet") // false
"alphabet".contains("") // true