我有當前的代碼如下面所列:NSPredicate NSUnknownKeyException - SWIFT 4.0
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:]
':
這個類別不是密鑰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
}
}
String屬性NSPredicate它的工作原理完全沒問題。 - 將@objc添加到類 - 另外,將@objc添加到屬性
https://stackoverflow.com/questions/44390378/how-can-i-deal-with-objc-inference-deprecation-with-selector-in-swift-4的可能的複製 - 你加'@ objc'將'userId'屬性暴露給Objective-C? –
不相關,但爲什麼你聲明屬性爲隱式unwrapped optionals,儘管它們用非可選值明確初始化?不要這樣做。刪除感嘆號。是的,你不會收到編譯器錯誤。在課程開始之前'@ objc'不會影響成員。在你需要的每個成員之前使用'@ objcMembers'或者添加'@ objc'。儘管如此,沒有理由使用'NSPredicate'。 – vadian
您是否嘗試向'userID'屬性本身添加'@ ojbc'?對於'@ objc'行爲,Swift 4.0比以前的版本更挑剔。 –