String UISearchController包含在字典数组中找不到部分结果

String UISearchController包含在字典数组中找不到部分结果,string,swift,nspredicate,contains,uisearchcontroller,String,Swift,Nspredicate,Contains,Uisearchcontroller,我试图使用谓词从searchController中搜索字典对象数组中的字符串值。我没有得到任何部分字符串匹配。我需要在许多键值中搜索匹配项,因此我按照下面代码中的说明进行操作 我的问题是如果我搜索:Orida 我找不到:佛罗里达 我相信我的谓词集是正确的 self.filteredData.removeAll(keepCapacity: false) let searchPredicate = NSPredicate(format: "SELF CONTAINS[cd] %@", self.s

我试图使用谓词从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>]
我得到以下错误:

'(String) -> Bool' is not convertible to '([String : String]) -> Bool'
我对如何让它正确处理字符串字典感到困惑

self.filteredData = self.airportData.filter({(item: String) -> Bool in
    var stringMatch = item.lowercaseString.rangeOfString(self.searchController.searchBar.text!)
    return stringMatch != nil ? true : false
})

请尝试在阵列上使用swift筛选器方法执行此操作

经过@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()
                    }



            });
        }
    }

self.airportData中的NSDictionary看起来像什么?他们都有相同的钥匙吗?@larme他们有不同的钥匙。但每本字典都是如此。目前大约有5把钥匙。嗯。。复制粘贴后,我立即出现了一个错误-'String->Bool'不能转换为[String:String]->Bool'。我要试着找出我需要做什么转换或改变才能让你的答案生效,来测试它。哦,对不起,我没意识到你在用字典。您可能必须像在原始代码中一样将其强制转换为数组。强制转换将发生在哪里?如果这是一个愚蠢的问题,我很抱歉——我对斯威夫特还不熟悉,但这一结束让我感到困惑。会不会是在}结束闭包之后,然后就像![字典]?您是要对整个字典排序,还是只对键或值排序?数组包含机场数据字典。我希望过滤数组以包含与搜索栏文本匹配的条目的字典
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()
                    }



            });
        }
    }