使用 NSPredicate 搜索字符串数组

Posted

技术标签:

【中文标题】使用 NSPredicate 搜索字符串数组【英文标题】:Search array of array of strings with NSPredicate 【发布时间】:2015-08-20 17:42:04 【问题描述】:

我有一个搜索数组数组的 NSSearchController。这个主数组的一个例子是

[["key1',"value1"],["key2","value2"]]

我的搜索功能如下:

func updateSearchResultsForSearchController(searchController: UISearchController) 
    for (key, val) in zip(self.keys, self.values) 
        pairs.append([key,val])
    

    filteredKeys.removeAll(keepCapacity: false)
    filteredValues.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
    let searcher = (self.pairs as NSArray).filteredArrayUsingPredicate(searchPredicate)
    println(searcher)

    for matched in searcher 
        var appendedKey = matched[0] as! String
        var appendedValue = matched[1] as! String
        filteredKeys.append(appendedKey)
        filteredValues.append(appendedValue)
    

    pairs.removeAll(keepCapacity: false)

    self.tableView.reloadData()

问题出在我的 NSPredicate 字符串上,当我搜索数组数组时,SELF CONTAINS 需要在数组中精确匹配字符串,而不是只包含它。我真的希望主数组的子数组包含正在搜索的字符串。

我试过 "name CONTAINS[c] %@" 和 "SELF BEGINSWITH[c] %@" 都失败了。有谁知道使用什么谓词字符串来搜索数组?

【问题讨论】:

【参考方案1】:

您需要使用ANY SELF

let pairs = [["key1","value1"],["key2","value2"]]
let searchPredicate = NSPredicate(format: "ANY SELF CONTAINS[c] %@", "lue2")
let searcher = (pairs as NSArray).filteredArrayUsingPredicate(searchPredicate)
println(searcher) // Prints the second element

从official documentation 到ANY

指定以下表达式中的任何元素。

【讨论】:

以上是关于使用 NSPredicate 搜索字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 和数组进行 cloudKit 搜索

NSPredicate 根据本地化字符串条目过滤数组

NSPredicate匹配字符串

带有嵌套数组的 NSPredicate

NSPredicate 过滤数组的一部分

NSPredicate 使用 CloudKit 进行不区分大小写的字符串搜索