2015-10-13 31 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() 
        } 



      }); 
     } 
    }