UISearchController CONTAINS没有在Dictionary of Dictionary

时间:2015-10-13 16:57:24

标签: string swift nspredicate contains uisearchcontroller

我正在尝试使用谓词来搜索字典对象数组中的字符串值(来自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'

我对如何正确处理字符串字典感到困惑。

2 个答案:

答案 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()
                    }



            });
        }
    }