错误如下
'[<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就会报错导致程序崩溃,在网上找了半天后发先原因:在Swift 4中继承 NSObject 的 swift class 不再默认全部 bridge 到 OC,如果我们想要使用的话我们就需要在class前面加上@objcMembers 这么一个关键字。
在 swift 3 中class 继承了 NSObject 后,编译器就会默认给这个类中的所有函数都标记为 @objc ,支持 OC 调用。而在swift4中不会默认添加,所以需要手动添加
解决办法(一)
//在对象声明前加上了@objc
@objc var name: String?
解决办法(二)
//在类声明前加@objcMembers
@objcMembers
class Person: NSObject
注意
如果是int等
基本数据类型,不能设置可选的,而且要设置初始值,否则还会报这个错,因为在swift
中int
是一个基本数据类型
的结构体
,OC中没有,OC只有基本数据类型