如何在 NSPredicate 的帮助下使用自定义对象数组实现搜索?

Posted

技术标签:

【中文标题】如何在 NSPredicate 的帮助下使用自定义对象数组实现搜索?【英文标题】:How to implement search using array of custom objects with help of NSPredicate? 【发布时间】:2018-05-04 08:51:10 【问题描述】:
private  var contactsWithSections = [[WPH]]()

WPH 具有以下属性:

class WPH: NSObject 
    var fName: String? = nil
    var lName: String? = nil
    var number: String? = nil
    var email: String? = nil

我想根据 fName 进行搜索,即在数组中有 fname = alex, fname = alena, fname =flora

let searchStr = "al"

那么结果应该返回 alex 和 alena 的对象

【问题讨论】:

Swift: Filtering an array of structures using UISearchController/Predicates的可能重复 【参考方案1】:

找到与我的问题完美匹配的更相关的解决方案

let filtered = MasterList!.filter  (data) -> Bool in
            return data.fName?.range(of: Key, options: String.CompareOptions.caseInsensitive) != nil || data.lName?.range(of: Key, options: String.CompareOptions.caseInsensitive) != nil
        

【讨论】:

【参考方案2】:

你可以只使用平面地图然后过滤器

FlatMap 将加入所有部分过滤器将使用您的密钥对其进行过滤

let results  =  contactsWithSections.flatMap $0.filter  (obj) -> Bool in
        guard let keyValue = obj.fName else  return false
        return keyValue == searchStr
    

【讨论】:

它对我不起作用。 private var contactsWithSections = [[WPH]]() 如果有部分和内容。我需要使用 let searchStr = "al" 搜索所有匹配项,但您的代码将返回唯一值。 平面地图工作正常,但未返回匹配结果。 如果条件ok,前面的代码应该返回匹配的结果,你将应用平面图,然后在平面数组上应用过滤器,请参阅解决方案

以上是关于如何在 NSPredicate 的帮助下使用自定义对象数组实现搜索?的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 101:将 NSPredicate 与自定义对象的 NSMutableArray 一起使用

使用 NSPredicate 搜索/过滤自定义类数组

将实体的自定义字段与 NSPredicate 一起使用

Cocoa 中的自定义 NSPredicate

NSPredicate 根据嵌套结构中的属性过滤自定义对象

Quickblox 自定义对象数组的 NSPredicate