swift4.0 KVC 错误 this class is not key value coding-compliant for the key name.解决方案

错误如下

'[ 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等基本数据类型,不能设置可选的,而且要设置初始值,否则还会报这个错,因为在swiftint是一个基本数据类型结构体,OC中没有,OC只有基本数据类型

你可能感兴趣的:(swift4.0 KVC 错误 this class is not key value coding-compliant for the key name.解决方案)