2015-12-29 6 views
9

Wenn mein Haupt Array ist ["Hello","Bye","Halo"], und ich suche nach "lo", wird das Array nur auf ["Hello", "Halo"] filtern.Filter Array von Zeichenfolgen, einschließlich "like" Bedingung

Dies ist, was ich versucht habe:

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

Es wirft

Type of expression is ambiguous without more context 

Irgendwelche Vorschläge?

Antwort

36

Verwenden contains statt:

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

Ausgabe

[ "Hallo", "Halo"]

Dank @ user3441734 für den Hinweis, dass die Funktionalität von natürlich nur verfügbar bei Ihnen import Foundation

+0

.. und nicht Import Foundation – user3441734

+0

Awesome, dank vergessen. Gib mir ein paar Minuten, bevor ich UpVote –

+0

@ user3441734 Danke, du hast Recht über diese - immer die Importe vergessen, weil sie bereits im Projekt sind. – luk2302

2

Sie müssen auch mit NSNotFound vergleichen. Die Dokumentation für rangeOfString: options: sagt:

Eine NSRange-Struktur, die den Ort und die Länge im Empfänger des ersten Auftretens von aString angibt, modulo die Optionen in Maske. Gibt {NSNotFound, 0} zurück, wenn eine Zeichenfolge nicht gefunden wurde oder leer ist (@ "").

import Foundation 

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

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

mit Hilfe von String-Erweiterung Sie reine Swift-Lösung (ohne Import Foundation) verwenden können. Ich habe die Geschwindigkeit nicht überprüft, aber es sollte nicht schlechter sein als das Gründungsäquivalent.

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 
24

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) 

Output

["Hello", "Halo"] 
+1

Er bat um schnelle ** zwei ** Syntax. Worauf kommt es an, eine schnelle Antwort zu geben? – GhostCat

+5

Wenn jemand nur nach dem Filter String Array sucht, bekommt er/sie die Antwort und aktualisiert das Wissen über die Syntax in der aktualisierten Version –

+6

Ich denke, es wurde um Swift 2 gebeten, cose war in diesem Moment aktuell, jetzt arbeiten wir mit Swift 3, also ist es für diesen Moment wertvoller. – Resty

2

mein versuchen ...

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

Swift 3,1

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

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

print(filteredCatalogNames) 
Verwandte Themen