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

Tim*_*ent 7 key-value-coding nspredicate swift

当我使用Predicate过滤自定义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)
Run Code Online (Sandbox Code Playgroud)

jpe*_*erl 12

您的Seed类是否继承自NSObject?

如果没有,这就是您将获得的信息.

解:

class Seed: NSObject {
   ...
Run Code Online (Sandbox Code Playgroud)

编辑: stklieme是正确的 - 要使用NSPredicate,您的对象的类需要-valueForKey按照NSKeyValueCoding协议的定义来实现.您可以定义自己的实现-valueForKey,也可以让您的类继承自NSObject,它会为您处理.

这是在NSPredicate的Apple文档中定义的,

您可以将谓词与任何类对象一起使用,但该类必须支持要在谓词中使用的键的键值编码.