Swift 2 – 过滤string数组,包括“like”条件

我找不到Swift 2语法解决scheme。

如果我的主数组是["Hello","Bye","Halo"] ,我正在search"lo" ,它将只将数组过滤为["Hello", "Halo"]

这是我试过的:

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

它抛出

 Type of expression is ambiguous without more context 

有什么build议么?

使用containsString来代替:

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

输出

[“你好”,“光晕”]

感谢@ user3441734指出,当你import Foundation时,这个function当然是可用的

在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) 

产量

 ["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) 

您还需要与NSNotFound进行比较。 rangeOfString:options的文档说:

一个NSRange结构,在接收者的第一次出现的aString中给出位置和长度,以掩码中的选项为模。 如果未findaString或为空(@“”),则返回{NSNotFound,0}。

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

在string扩展的帮助下,您可以使用纯Swift解决scheme(无需导入Foundation)。 我没有检查速度,但它不应该等同于基础。

 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 

我的尝试…

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