1. 程式人生 > >swift3.0轉4.0遇到的坑

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) {

    }
}