我目前的代码如下所示:
class ViewController:UIViewController{
ovveride func viewDidLoad(){
filterData()
}
func filterData(){
var usersArray = [User(name:"John",userId:1),User(name:"Ed",userId:2),User(name:"Ron",userId:3)]
let filteredData = (userArray as NSArray).filtered(using:NSPredicate(format: "userId=1"))
}
}
上面的代码抛出抛出以下异常(NSUnknownKeyException
):
对象类型'
[<ViewController.User 0x6000000afa20> valueForUndefinedKey:]
&#39;:
对于密钥userId
,此类不符合密码值编码。
Apple filter(using:)
的文档未指明可能导致此问题的任何更改。
如何在Swift 4.0中使用NSPredicate
?
另外,根据要求,我尝试使用@objc
。但是,仍然是同样的错误。
@objc
class User:NSObject{
var name:String!
var userId:Int!
init(name:String,userId:Int){
self.name = name
self.userId = userId
}
}
收到针对此问题的进一步评论,在将@objc属性添加到userId
时,我会收到以下消息。
属性无法标记为@objc,因为其类型无法在Objective-C中表示
@objc
class User:NSObject{
@objc var name:String!
var userId:Int! //@objc here results in error
init(name:String,userId:Int){
self.name = name
self.userId = userId
}
}
字符串属性NSPredicate它完全正常。 - 将@objc添加到课堂 - 另外,将@objc添加到属性
答案 0 :(得分:3)
为什么不使用filter
?它更多&#34; Swift-y&#34;并且不涉及将您的数组转换为NSArray
。
let filteredData = usersArray.filter { $0.userId == 1 }