在Swift中对数组对象使用谓词返回错误
当我使用谓词过滤自定义Swift类数组时,我得到错误: ***NSForwarding:警告:类“Plantivo1_6.Seed”的对象0x78ed21a0未实现methodSignatureForSelector:--前面有故障在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
无法识别的选择器-[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对一个类提出了与此无关的附加要求。谢谢你,朋友!!