web-dev-qa-db-fra.com

Filtrer un tableau de chaînes, y compris la condition "like"

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?

23
Roi Mulia

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

68
luk2302

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"]
27
Ashok R

Swift 3.1

let catalogNames = [ "Hats", "Coats", "Trousers" ]
let searchCatalogName = "Hats"

let filteredCatalogNames = catalogNames.filter { catalogName in 
    return catalogName.localizedCaseInsensitiveContains(searchCatalogName)
}

print(filteredCatalogNames)
6
Roshna D'souza

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"]
3
米米米

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
}
2
Oliver Atkinson

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
2
user3441734