NSPredicate 对象模型数组过滤器在 Swift 4.0 中无法正常工作

Posted

技术标签:

【中文标题】NSPredicate 对象模型数组过滤器在 Swift 4.0 中无法正常工作【英文标题】:NSPredicate object model array filter not working its crashing in Swift 4.0 【发布时间】:2018-02-20 08:57:10 【问题描述】:

    我在 swift 4.0 中工作,我在 MutableArray 中有模型对象, NSPredicate 不起作用。

                 //Here is code
                //Model class:
                class Modelclass: NSObject
                
                    var firstName:String!
                    var lastName:String!
                
    
                // Viewcontroller doing predicate:
                let ary = NSMutableArray()
    
                let userModel          = Modelclass()
                userModel.firstName    = "Arrya"
                userModel.lastName     = "stark"
                ary.add(userModel)
    
                let commitPredicate = NSPredicate(format: "firstName == %@", "Arrya")
                let resultAry       = ary.filtered(using: commitPredicate)
                print(resultAry)
    

【问题讨论】:

使用[Modelclass]而不是NSMutableArray,快捷方式 还像这样将 'let' 更改为 'var' 我已将您的代码更改为此并且工作正常 var ary:[Modelclass] = [] ary.append(userModel) let resultAry = ary.filter $0.firstName == "艾莉亚" 【参考方案1】:

我解决了这个问题, 解决方案一:

    //I just added below code in model class

    extension Modelclass 
        @objc override func value(forKey key: String) -> Any? 
            switch key 
            case "firstName":
                return firstName
            case "lastName":
                return lastName
            default:
                return nil
            
         
   

解决方案 2:

在变量前添加@objc:

        class Modelclass: NSObject
        
            @objc var firstName:String!
            @objc var lastName:String!

        

【讨论】:

var firstName:String! 之前添加@objc(=> @objc var firstName:String! 也应该这样做,避免你自己覆盖value(forKey:)【参考方案2】:
    var 用于可变内容/变量 在swift中你可以使用filter替代NSPredicate

试试这样:

            //Model class:
            class Modelclass
            
                var firstName: String
                var lastName: String

                init(firstName: String, lastName: String) 
                    self.firstName = firstName
                    self.lastName = lastName
                
            

            // Viewcontroller doing predicate:
            var ary:[Modelclass] = []

            let userModel = Modelclass(firstName: "Arrya", lastName: "stark")
            ary.append(userModel)

            let resultAry = ary.filter $0.firstName == "Arrya" 
            print(resultAry)

【讨论】:

很好,这是否可以像 NSPredicate(format: "(firstName BEGINSWITH[cd] %@)","Ar") 那样过滤 BEGINSWITH 搜索? $0.firstName.hasPrefix("Ar")

以上是关于NSPredicate 对象模型数组过滤器在 Swift 4.0 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 NSPredicate 过滤 Core Data 托管对象?

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

ios开发中NSArray怎么用NSPredicate来过滤数组内容

NSPredicate 与具有多个对象的 Array 一起使用

如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?

Quickblox 自定义对象数组的 NSPredicate