錯誤如下
'[<KVC.Person 0x604000249d20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'
示例代碼
class Person: NSObject {
var name: String?
init(dict :[String: String]) {
super.init()
setValuesForKeys(dict)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let p = Person(dict: ["name" : "zml"])
print("\(p.name ?? "xxx")")
}
}
在swift3.0時沒問題的,但在4.0就會報錯導致程序崩潰,在網(wǎng)上找了半天后發(fā)先原因:在Swift 4中繼承 NSObject 的 swift class 不再默認全部 bridge 到 OC,如果我們想要使用的話我們就需要在class前面加上@objcMembers 這么一個關鍵字。
在 swift 3 中class 繼承了 NSObject 后,編譯器就會默認給這個類中的所有函數(shù)都標記為 @objc ,支持 OC 調用。而在swift4中不會默認添加,所以需要手動添加
解決辦法(一)
//在對象聲明前加上了@objc
@objc var name: String?
解決辦法(二)
//在類聲明前加@objcMembers
@objcMembers
class Person: NSObject
注意
如果是int等基本數(shù)據(jù)類型,不能設置可選的,而且要設置初始值,否則還會報這個錯,因為在swift中int是一個基本數(shù)據(jù)類型的結構體,OC中沒有,OC只有基本數(shù)據(jù)類型