swift3.0转4.0遇到的坑

我们以斗鱼APP为例,总结swift3.0以及swift4.0转换过程中遇到的问题。

一、方法重写问题

1、swift 3.0在子类中的方法重写

我们RecommendVC类继承自BaseAnchorVC,BaseAnchorVC中包含setupUI方法,我们重写setupUI方法,然后再子类RecommendVC中重写setupUI方法。

extension RecommendVC {
    override func setupUI(){
        //调用父类方法
        super.setupUI()
        collectionView.addSubview(cycleView)
        collectionView.addSubview(gameView)
        //拓宽collectionView的高度
        collectionView.contentInset = UIEdgeInsets(top: kCycleViewH+kGameViewH, left: 0, bottom: 0, right: 0)
    }
}

2、swift4.0方法的重写

在swift4.0方法中不可使已使用这种方法重写,否则会报错。如下图所示:
swift4.0在子类中重写方法错误
由于无法重写方法,所以我们目前就不重写父类方法,而是重新给子类定义一个方法使用。

二、KVC自动赋值问题

1、在swift3.0中,我们从服务器获取数据之后,进行字典转模型,然后使用KVC自动赋值。

class CycleModel: NSObject {
    var title : String = ""
    var pic_url : String = ""
    var anchor : AnchorModel?
    //didSet自动监控值的变化,使用guard进行检验
    var room :[String :Any]?{
        didSet{
            guard let room = room  else {
                return
            }
            anchor = AnchorModel(dict: room)
        }
    }    
    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)
    }
    //防止在KVC赋值时有找不到key导致的崩溃
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}

2、在swift4.0中,直接这样使用无效。

我们必须在属性前添加@objc,只有这样才能满足OC的KVC赋值。

class CycleModel: NSObject {
    @objc var title : String = ""
    @objc var pic_url : String = ""
    @objc var anchor : AnchorModel?
    @objc var room :[String :Any]?{
        didSet{
            guard let room = room  else {
                return
            }
            anchor = AnchorModel(dict: room)
        }
    }

    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)
    }

    override func setValue(_ value: Any?, forUndefinedKey key: String) {

    }
}

猜你喜欢

转载自blog.csdn.net/xiaoxiaocode/article/details/80318958