2017-10-21 59 views
0

我有當前的代碼如下面所列: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添加到屬性

+3

https://stackoverflow.com/questions/44390378/how-can-i-deal-with-objc-inference-deprecation-with-selector-in-swift-4的可能的複製 - 你加'@ objc'將'userId'屬性暴露給Objective-C? –

+1

不相關,但爲什麼你聲明屬性爲隱式unwrapped optionals,儘管它們用非可選值明確初始化?不要這樣做。刪除感嘆號。是的,你不會收到編譯器錯誤。在課程開始之前'@ objc'不會影響成員。在你需要的每個成員之前使用'@ objcMembers'或者添加'@ objc'。儘管如此,沒有理由使用'NSPredicate'。 – vadian

+1

您是否嘗試向'userID'屬性本身添加'@ ojbc'?對於'@ objc'行爲,Swift 4.0比以前的版本更挑剔。 –

回答

3

爲什麼不只是使用filter?它更「Swift-y」,不涉及將你的數組轉換爲NSArray

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

我正在嘗試使用NSPredicate與篩選器{},您提到的那個篩選器。不知道爲什麼它不適用於NSPredicate - 沒有編譯時錯誤? – andyPaul

+0

是否有特定的原因需要使用'NSPredicate'? [Martin R](https://stackoverflow.com/users/1187415/martin-r)已經在評論中爲此寫了一個可能的解決方案。 – the4kman