在Swift中对数组对象使用谓词返回错误

在Swift中对数组对象使用谓词返回错误,swift,nspredicate,key-value-coding,Swift,Nspredicate,Key Value Coding,当我使用谓词过滤自定义Swift类数组时,我得到错误: ***NSForwarding:警告:类“Plantivo1_6.Seed”的对象0x78ed21a0未实现methodSignatureForSelector:--前面有故障 无法识别的选择器-[Plantivo1_6.Seed valueForKey:] 如果我没记错的话,这将在Objective-C中起作用。我的错误是什么 let names = ["Tom","Mike","Marc"] println(names) let sea

当我使用谓词过滤自定义Swift类数组时,我得到错误:

***NSForwarding:警告:类“Plantivo1_6.Seed”的对象0x78ed21a0未实现methodSignatureForSelector:--前面有故障
无法识别的选择器-[Plantivo1_6.Seed valueForKey:]

如果我没记错的话,这将在Objective-C中起作用。我的错误是什么

let names = ["Tom","Mike","Marc"]
println(names)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", "om")
let array = (names as NSArray).filteredArrayUsingPredicate(searchPredicate)
println(array)
println()

let mySeed1 = Seed()  // Seed is a class with a `culture` String property
let mySeed2 = Seed()
let mySeed3 = Seed()
mySeed1.culture = "Tom"
mySeed2.culture = "Mike"
mySeed3.culture = "Marc"

let mySeeds = [mySeed1,mySeed2,mySeed3]
println(mySeeds)
let searchPredicate1 = NSPredicate(format: "SELF.culture CONTAINS[c] %@", "om")
let array1 = (mySeeds as NSArray).filteredArrayUsingPredicate(searchPredicate1)
println(array1)

您的种子类是否从NSObject继承

如果没有,这就是你将得到的信息

解决方案:

class Seed: NSObject {
   ...
编辑: stklieme是正确的-要使用NSPredicate,对象的类需要实现由定义的
-valueForKey
。您可以定义自己的
-valueForKey
实现,也可以让您的类从NSObject继承,NSObject将为您解决这一问题

这是在

可以对任何对象类使用谓词,但该类必须支持对要在谓词中使用的键进行键值编码


valueForKey
是一种键值编码方法。简单地将类Seed声明为符合KVC的NSObject的子类

您需要通过NSObject继承您的模型类,然后问题得到解决

class Seed: NSObject {
   ...
}
原因:
-NSKeyValueCoding协议定义的valueForKey。您可以定义自己的-valueForKey实现,也可以让类继承自NSObject

如果您不想继承自
NSObject
,您可以自己实现
value(forKey:String)->Any?
方法:

extension Model {
    @objc func value(forKey key: String) -> Any? {
        switch key {
        case "id":
            return id
        // Other fields
        default:
            return nil
        }
    }
}
注意
@objc
方法的前缀:这很重要,因为它允许
NSPredicate
查看方法的实现。您仍然会收到
未实现methodSignatureForSelector:
崩溃,如果没有它

或者,更好的是,使您的对象符合此协议:

@objc protocol UsableInPredicate {
    @objc func value(forKey key: String) -> Any?
}

做了一些修改,这能更好地解释吗?这只是NSPredicate在内部将字符串转换为键的工作方式,该键可用于从类实例获取值。此谓词语法需要KVC,但不需要KVO。KVO对一个类提出了与此无关的附加要求。谢谢你,朋友!!