錯誤如下
'[<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就會報錯導(dǎo)致程序崩潰,在網(wǎng)上找了半天后發(fā)先原因:在Swift 4中繼承 NSObject 的 swift class 不再默認(rèn)全部 bridge 到 OC,如果我們想要使用的話我們就需要在class前面加上@objcMembers 這么一個關(guān)鍵字。
在 swift 3 中class 繼承了 NSObject 后,編譯器就會默認(rèn)給這個類中的所有函數(shù)都標(biāo)記為 @objc ,支持 OC 調(diào)用。而在swift4中不會默認(rèn)添加,所以需要手動添加
解決辦法(一)
//在對象聲明前加上了@objc
@objc var name: String?
解決辦法(二)
//在類聲明前加@objcMembers
@objcMembers
class Person: NSObject
注意
如果是int等基本數(shù)據(jù)類型,不能設(shè)置可選的,而且要設(shè)置初始值,否則還會報這個錯,因為在swift中int是一個基本數(shù)據(jù)類型的結(jié)構(gòu)體,OC中沒有,OC只有基本數(shù)據(jù)類型