2015-10-13 58 views
0

我想用一个谓词来搜索字典对象的数组以获得字符串值(来自searchController)。我没有得到任何部分字符串匹配。我需要搜索一个匹配的许多键值,所以我按照下面的代码编写。UISearchController CONTAINS CONTAINS在字典数组中找不到部分结果

我的问题是,如果我搜索:“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

是什么样子'NSDictionary'在'self.airportData'?他们都拥有相同的钥匙吗? – Larme

+0

@larme他们有不同的钥匙。尽管每个字典都是。目前大约有5个键。 – Charlie

回答

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方法来代替。

+0

嗯..我有一个错误马上复制粘贴蝙蝠 - '(字符串) - >布尔'不可转换为([字符串:字符串]) - >布尔'。我会试着弄清楚我需要施放或更改什么,以使您的答案能够测试出来。 – Charlie

+0

哦,对不起,我没有意识到你正在使用字典。您可能必须将其转换为像您在原始代码中那样的阵列。 – pbush25

+0

演员阵容在哪里?我很抱歉,如果这是一个愚蠢的问题 - 我是新来的迅速和封闭抛出我仍然。它会在关闭结束的})之后,然后是“as![Dictionary ]”吗? – Charlie

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



      }); 
     } 
    }