2015-12-29 10 views
9

Jeśli moja główna tablica to ["Hello","Bye","Halo"], a ja szukam "lo", będzie ona filtrować tablicę tylko do ["Hello", "Halo"].Tablica filtrów ciągów znaków, w tym warunek "podobny"

To co próbowałem:

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

To rzuca

Type of expression is ambiguous without more context 

Wszelkie sugestie?

Odpowiedz

36

Zastosowanie contains zamiast:

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

Wyjście

[ "Witam", "Halo"]

Dzięki @ user3441734 za wskazanie, że funkcjonalność jest oczywiście tylko dostępne, gdy: import Foundation

+0

.. i nie zapomnij Fundacja import – user3441734

+0

super, dzięki. Daj mi kilka minut, zanim będę mógł uzyskaćPowiadanie –

+0

@ user3441734 dzięki, masz rację, że o tym jeden - zawsze zapomnij o imporcie, ponieważ są już w projekcie. – luk2302

2

Musisz również porównać do NSNotFound. Dokumentacja dla rangeOfString: opcje: mówi:

Struktura NSRange podająca lokalizację i długość w odbiorniku pierwszego wystąpienia aString, modulo opcje w masce. Zwraca {NSNotFound, 0}, jeśli aString nie został znaleziony lub jest pusty (@ "").

import Foundation 

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

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

z pomocą rozszerzenia String można użyć czystego roztworu Swift (bez Fundacji importu). Nie sprawdzałem prędkości, ale nie powinno być gorzej, jak ekwiwalent podstawy.

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

w 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

Prosił o szybką ** dwie ** składnię. Jaki jest sens udzielenia szybkiej odpowiedzi? – GhostCat

+5

Kiedy tylko ktoś wyszuka tylko tablicę z filtrem, otrzyma odpowiedź, a także może zaktualizować znajomość składni w ulepszonej wersji. –

+6

Myślę, że został poproszony o Swift 2, cose był w tym momencie aktualny, teraz pracujemy z Swift 3, więc jest bardziej wartościowy na tę chwilę. – Resty

2

moich spróbować ...

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) 
Powiązane problemy