在[(String,Array< String>)]上应用NSPredicate [英] Apply NSPredicate on [(String, Array<String>)]

查看:58
本文介绍了在[(String,Array< String>)]上应用NSPredicate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以这种方式存储数据,

I have data stored in this fashion,

var data = [(String, Array<String>)]()

示例数据:

[(A, [Apple, Andy, Android]), (B, [Banana, Breakfast])]

我正在尝试通过使用谓词对此数据应用搜索过滤器,

I am trying to apply a search filter on this data by using Predicate,

这就是我的尝试和失败,

Here is what I am tried and failed,

func updateSearchResultsForSearchController(searchController: UISearchController) {
      let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text) 
      let array = (data as NSArray).filteredArrayUsingPredicate(searchPredicate)
      data = array as! [(String, Array<String>)]

      //reload tableView with fresh data
      self.tableView.reloadData()
}

失败,因为我试图将我的 data 转换为NSArray以应用过滤器,然后尝试将过滤后的数组转换回我想要的格式.(我知道这种转换是行不通的,这只是为了让大家了解我正在尝试做的事情.)

Its failing as I am trying to convert my data into NSArray to apply filter and then trying to convert the filtered array back to my desired format. (I know that this conversion won't work, this is just to give you guys an idea of what I am trying to do.)

我的问题是如何在 data 的字符串数组上应用搜索过滤器?

My question is how to apply search filter on my data's array of Strings ?

例如,如果搜索词为"an",则 data 应过滤为

As in, if the search term is "an", the data should filter to

[(A, [Andy, Android]), (B, [Banana])]

推荐答案

由于数组包含元组,因此可以使用以下方法来过滤数据,而不必使用 NSPredicate :

Since your array contains tuples, instead of using NSPredicate, you can use the following method for filtering your data:

func getFilteredData(data : [(String, Array<String>)], ltrToCompare : String) -> [(String, Array<String>)]
{
    // For keeping the filtered result
    var returnData = [(String, Array<String>)]()

    // Looping through parent array        
    for (letter, arr) in data
    {
        // Filters the internal array [String]
        let filter = arr.filter()
        {
            return $0.lowercaseString.rangeOfString(ltrToCompare.lowercaseString) != nil
        }

        // Checks whether the inner array filtering returns any element
        if (filter.count != 0)
        {
            returnData.append((letter, filter));
        }
    }
    return returnData
}

从以下位置调用该方法:

Call that method from:

func updateSearchResultsForSearchController(searchController: UISearchController)
{
      data = getFilteredData(data, ltrToCompare: searchController.searchBar.text)
      //reload tableView with fresh data
      self.tableView.reloadData()
}

这篇关于在[(String,Array&lt; String&gt;)]上应用NSPredicate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆