Swift 3.0升级Swift 4.0的那些坑

今天楼主要把老项目从3.0升级至4.0,升级之后项目运行不报错,但是所有页面都没有数据,故推断是baseModel里出了问题,我的baseModel里是这样写的

    init(_ dictionary:[String : Any]?) {
        super.init()
        if dictionary == nil{
            return
        }
        self.setValuesForKeys(dictionary!)
    }
    
    override func setValue(_ value: Any?, forKey key: String) {
        super.setValue(value, forKey: key)
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }

检查之后发现这么写并没有问题,那么问题出在了哪里呢?

向下检查baseModel子类,发现出在了baseModel子类里面

class ERPImModel: ERPBaseModel {
    
    var page_no = ""
    var page ""

}

baseModel中我使用了setValueForkey,由于继承自NSObjct所以子类model里的属性在swift3.0下是自动添加@objc的, 而swift4.0不会自动添加@objc,没有运行时特性,需要我们手动添加@objc(暂且这么理解,实际上 Swift 的静态语言特性,每个函数的调用在编译期间就可以确定。因此在编译完成后可以检测出没有被调用到的 swift 函数,优化删除后可以减小最后二进制文件的大小。这个功能在 XCode 9 和 Swift 4 中终于被引进。实际上即使你添加了@objc swift也会自动优化变成静态调用的,如果要使用oc的运行时特性则要添加dynamic,请移步他处)

修改子类model如下

class ERPImModel: ERPBaseModel {
    
    @objc var page_no = ""
    @objc var page = ""

}

完美升级4.0

你可能感兴趣的:(Swift 3.0升级Swift 4.0的那些坑)