swift3.0轉4.0遇到的坑
阿新 • • 發佈:2019-02-17
我們以鬥魚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方法中不可使已使用這種方法重寫,否則會報錯。如下圖所示:
由於無法重寫方法,所以我們目前就不重寫父類方法,而是重新給子類定義一個方法使用。
二、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) {
}
}