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