NSPredicate NSUnknownKeyException - Swift 4.0

时间:2017-10-21 14:53:20

标签: swift nspredicate

我目前的代码如下所示:

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):

  

对象类型&#39; [<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添加到属性

1 个答案:

答案 0 :(得分:3)

为什么不使用filter?它更多&#34; Swift-y&#34;并且不涉及将您的数组转换为NSArray

let filteredData = usersArray.filter { $0.userId == 1 }