iOS杂文iOS 基础知识

在swift 4.0中用系统方法setValuesForKeys

2018-01-08  本文已影响54人  i诺离

网络请求数据后,解析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

http://www.cocoachina.com/bbs/read.php?tid-1726285.html

http://www.hangge.com/blog/cache/detail_1839.html

上一篇下一篇

猜你喜欢

热点阅读