网络请求数据后,解析json数据,得到模型对象 使用Swift4.0,通过setValuesForKeys保存字典数据,无法存储
代码如下
class BaseGameModel: NSObject {
// MARK:- 定义属性
var tag_name : String = ""
var icon_url : String = ""
// MARK:- 自定义构造函数
override init() {
}
init(dict : [String : Any]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: <span class="hljs-built_in">String</span>) {
print(key)
}
}
明明有tag_name、icon_url 属性,依然会走
override func setValue(_ value: Any?, forUndefinedKey key: String) {
print(key)
}
打印出key,值为tag_name、icon_url
原因
在swift3中,编译器自动推断@objc,换句话说,它自动添加@objc
在swift4中,编译器不再自动推断,你必须显式添加@objc
解决
// MARK:- 定义属性
@objc var tag_name : String = ""
@objc var icon_url : String = ""
详细说明
(1)在 Swift 4 中隐式 @objc 自动推断只会发生在下面这种必须要使用 @objc 的情况:
覆盖父类的 Objective-C 方法
符合一个 Objective-C 的协议
(2)大多数地方必须手工显示地加上 @objc。
class MyClass: NSObject {
@objc func print() { } //显示的加上 @objc
@objc func show() { } //显示的加上 @objc
}
(3)如果在类前加上 @objcMembers,那么它、它的子类、扩展里的方法都会隐式的加上 @objc。
@objcMembers
class MyClass: NSObject {
func print() { } //包含隐式的 @objc
func show() { } //包含隐式的 @objc
}
extension MyClass {
func baz() { } //包含隐式的 @objc
}
(4)如果在扩展(extension)前加上 @objc,那么该扩展里的方法都会隐式的加上 @objc。
class SwiftClass { }
@objc extension SwiftClass {
func foo() { } //包含隐式的 @objc
func bar() { } //包含隐式的 @objc
}
(5)如果在扩展(extension)前加上 @nonobjc,那么该扩展里的方法都不会隐式的加上 @objc。
@objcMembers
class MyClass : NSObject {
func wibble() { } //包含隐式的 @objc
}
@nonobjc extension MyClass {
func wobble() { } //不会包含隐式的 @objc
}
参考
http://www.cocoachina.com/bbs/read.php?tid-1726285.html
http://blog.csdn.net/dazhaoDai/article/details/78585415?locationNum=1&fps=1
http://blog.csdn.net/dazhaoDai/article/details/78585415?locationNum=1&fps=1