我正在尝试使用谓词来搜索字典对象数组中的字符串值(来自searchController)。我没有得到任何部分字符串匹配。我需要搜索匹配的许多键值,所以我按照下面的代码编写它。
我的问题是,如果我搜索:“Orida” 我不是在寻找:“佛罗里达”
我相信我已经正确设置了谓词......
self.filteredData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[cd] %@", self.searchController.searchBar.text!)
let array = (self.airportData as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredData = array as! [Dictionary<String, String>]
如果我输入出现在字典的任何值中的完全匹配的字符串,它会正常工作,但如果我搜索部分匹配则不会...
这不是一个重复的帖子 - 我发现的所有与此相关的现有帖子都没有搜索多个值(例如我的词典中的多个键值)或正在使用字符串本身的contains()方法。
更新
我使用过滤器尝试了下面建议的答案:
let searchPredicate = NSPredicate(format: "SELF CONTAINS[cd] %@", searchController.searchBar.text!)
let array = (self.airportData as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredData = self.airportData.filter({(item: String) -> Bool in
var stringMatch = item.lowercaseString.rangeOfString(self.searchController.searchBar.text!)
return stringMatch != nil ? true : false
我收到以下错误:
'(String) -> Bool' is not convertible to '([String : String]) -> Bool'
我对如何正确处理字符串字典感到困惑。
答案 0 :(得分:0)
self.filteredData = self.airportData.filter({(item: String) -> Bool in
var stringMatch = item.lowercaseString.rangeOfString(self.searchController.searchBar.text!)
return stringMatch != nil ? true : false
})
尝试使用数组上的swift filter
方法来执行此操作。
答案 1 :(得分:0)
经过@ pbush25的大量建议,我找到了答案。这不是我想要的,但它确实有效。我希望避免在字典中指定我想要搜索其值的所有键,但它最终成为我能想出的唯一方法来使其工作。我更喜欢使用array.filter,但我无法弄清楚如何将该闭包转换为正确的数组。
功能代码:
let startCount = searchController.searchBar.text!.length
delay(1) {
if self.searchController.searchBar.text!.length >= 3 && self.searchController.searchBar.text!.length == startCount{
self.view.addSubview(self.progressHud)
self.appDel.backgroundThread(background: {
self.filteredData.removeAll(keepCapacity: false)
let searchText = self.searchController.searchBar.text!.lowercaseString
self.filteredData = self.airportData.filter{
if let ident = $0["ident"] {
if ident.lowercaseString.rangeOfString(searchText) != nil {
return true
}
}
if let name = $0["name"] {
if name.lowercaseString.rangeOfString(searchText) != nil {
return true
}
}
if let city = $0["municipality"] {
if city.lowercaseString.rangeOfString(searchText) != nil {
return true
}
}
return false
}
},
completion: {
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
self.progressHud.removeFromSuperview()
}
});
}
}