前言

当我们想要Dict 转成Model的时候会这样写:

更新到swift4语法

init(dict: [String: AnyObject]) {
    super.init()
    setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {
    print(key)
}

但是!!!

到了Swift4以后setValuesForKeys() 看上去失效了

原因

swift3中,编译器自动推断@objc,换句话说,它自动添加@objc

swift4中,编译器不再自动推断,你必须显式添加@objc

解决

有两种

1.

class ABCModel: NSObject {
	@objc var a: String = ""
}

2.

@objcMembers
class ABCModel: NSObject {
	var a: String = ""
	var b: String?
	var c: Int = 0
	var d: Bool = false
}

注意

如果有IntBool 等基础类型,请手动赋默认值不然会不匹配

另外如果本来是 Bool 的 你用 String 去接收,会抛出异常,异常类似:

[__NSCFBoolean length]: unrecognized selector sent to instance 0x10cb5f3a0