美文网首页iOS杂文iOS 基础知识
在swift 4.0中用系统方法setValuesForKeys

在swift 4.0中用系统方法setValuesForKeys

作者: i诺离 | 来源:发表于2018-01-08 13:35 被阅读54次

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

    相关文章

      网友评论

        本文标题:在swift 4.0中用系统方法setValuesForKeys

        本文链接:https://www.haomeiwen.com/subject/htcbnxtx.html