siwft3.0轉(zhuǎn)4.0開(kāi)發(fā)中遇到的坑

我們以斗魚(yú)APP為例,總結(jié)swift3.0以及swift4.0轉(zhuǎn)換過(guò)程中遇到的問(wèn)題著榴。

一啤挎、方法重寫(xiě)問(wèn)題

1、swift 3.0在子類(lèi)中的方法重寫(xiě)

我們RecommendVC類(lèi)繼承自BaseAnchorVC炭玫,BaseAnchorVC中包含setupUI方法奈嘿,然后再子類(lèi)RecommendVC的繼承中重寫(xiě)setupUI方法,這樣是沒(méi)有問(wèn)題的吞加。

extension RecommendVC {
    override func setupUI(){
        //調(diào)用父類(lèi)方法
        super.setupUI()
        collectionView.addSubview(cycleView)
        collectionView.addSubview(gameView)
        //拓寬collectionView的高度
        collectionView.contentInset = UIEdgeInsets(top: kCycleViewH+kGameViewH, left: 0, bottom: 0, right: 0)
    }
}

2裙犹、swift4.0方法的重寫(xiě)

在swift4.0方法中不可使用這種方法重寫(xiě),否則會(huì)報(bào)錯(cuò)衔憨。如下圖所示:


swift4.0在子類(lèi)中重寫(xiě)方法錯(cuò)誤

由于無(wú)法重寫(xiě)方法叶圃,所以我們目前就不重寫(xiě)父類(lèi)方法,而是重新給子類(lèi)定義一個(gè)方法使用践图。

二掺冠、KVC自動(dòng)賦值問(wèn)題

1、在swift3.0中码党,我們從服務(wù)器獲取數(shù)據(jù)之后德崭,進(jìn)行字典轉(zhuǎn)模型,然后使用KVC自動(dòng)賦值揖盘。

注意:由于使用了KVC自動(dòng)賦值眉厨,在項(xiàng)目中極有可能出現(xiàn)我們模型中沒(méi)有定義的key導(dǎo)致的崩潰導(dǎo)致的崩潰,所以我們重寫(xiě)func setValue(_ value: Any?, forUndefinedKey key: String) 方法兽狭,防止崩潰憾股。

class CycleModel: NSObject {
    var title : String = ""
    var pic_url : String = ""
    var anchor : AnchorModel?
    //didSet自動(dòng)監(jiān)控值的變化,使用guard進(jìn)行檢驗(yàn)
    var room :[String :Any]?{
        didSet{
            guard let room = room  else {
                return
            }
            anchor = AnchorModel(dict: room)
        }
    }    
    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)
    }
    //防止在KVC賦值時(shí)有找不到key導(dǎo)致的崩潰
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}

2箕慧、在swift4.0中服球,直接這樣使用無(wú)效。

我們必須在屬性前添加@objc颠焦,只有這樣才能滿(mǎn)足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) {

    }
}
@objc知識(shí)擴(kuò)展
  • @objc 作用
    1、fileprivate 或者 private 保證方法私有 能在同一個(gè)類(lèi) 或者 同一個(gè)文件(extension)中訪問(wèn)這個(gè)方法 如果定義為private 那么只能在一個(gè)類(lèi)中訪問(wèn) 不能在類(lèi)擴(kuò)展中訪問(wèn)蒸健。
    2座享、允許這個(gè)函數(shù)在“運(yùn)行時(shí)”通過(guò)oc的消息機(jī)制調(diào)用。比如上面的KVC賦值屬性就必須使用@objc似忧。

三渣叛、swift中的@objc的作用

swift為靜態(tài)語(yǔ)言,每個(gè)函數(shù)在編譯期間就可以確定盯捌。因此在編譯完成后可以檢測(cè)出沒(méi)有被調(diào)用到的swift函數(shù)淳衙,優(yōu)化刪除后可以減小最后二進(jìn)制文件的大小。相較于OC是一個(gè)殺手級(jí)的特性。

那么箫攀,為什么OC沒(méi)有這個(gè)特性嫩肠牲?

那是因?yàn)镺C是動(dòng)態(tài)語(yǔ)言,調(diào)用函數(shù)是在運(yùn)行時(shí)通過(guò)發(fā)送消息調(diào)用的靴跛。所以在編譯期并不知道這個(gè)函數(shù)是否調(diào)用到缀雳,所以全部的方法都會(huì)保留。

  • 混合開(kāi)發(fā)中的問(wèn)題
    swift中的函數(shù)怎么知道是否被OC調(diào)用了呢梢睛?
    出于安全起見(jiàn)肥印,只能保留所有有可能會(huì)被OC調(diào)用的swift函數(shù),然后標(biāo)記為@objc绝葡。

在 swift 3 中除了手動(dòng)添加 @objc 聲明函數(shù)支持 OC 調(diào)用還有另外一種方式:繼承 NSObject深碱。class 繼承了 NSObject 后,編譯器就會(huì)默認(rèn)給這個(gè)類(lèi)中的所有函數(shù)都標(biāo)記為 @objc 藏畅,支持 OC 調(diào)用敷硅。然而在實(shí)際項(xiàng)目中,一個(gè) swift 類(lèi)雖然繼承了 NSObject愉阎,但是其中還是有很多函數(shù)不會(huì)在 OC 中被調(diào)用竞膳,這里有很大的優(yōu)化空間。于是根據(jù) SE160 的建議诫硕,蘋(píng)果修改了自動(dòng)添加 @objc 的邏輯:一個(gè)繼承 NSObject 的 swift 類(lèi)不再默認(rèn)給所有函數(shù)添加 @objc。只在實(shí)現(xiàn) OC 接口和重寫(xiě) OC 方法時(shí)才自動(dòng)給函數(shù)添加 @objc 標(biāo)識(shí)刊侯。

XCode 9會(huì)在運(yùn)行過(guò)程中自行檢測(cè)類(lèi)中函數(shù)是被 OC 調(diào)用章办,然后提示添加 @objc。下圖中的 vc 是 swift 中的類(lèi)滨彻,showStatus 也是 swift 函數(shù)藕届,現(xiàn)在編譯器會(huì)提示需要手動(dòng)添加 @objc:

斗魚(yú)github
學(xué)習(xí)資料
swift調(diào)用OC的作用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市亭饵,隨后出現(xiàn)的幾起案子休偶,更是在濱河造成了極大的恐慌,老刑警劉巖辜羊,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踏兜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡八秃,警方通過(guò)查閱死者的電腦和手機(jī)碱妆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昔驱,“玉大人疹尾,你說(shuō)我怎么就攤上這事。” “怎么了纳本?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵窍蓝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我繁成,道長(zhǎng)吓笙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任朴艰,我火速辦了婚禮观蓄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祠墅。我一直安慰自己侮穿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布毁嗦。 她就那樣靜靜地躺著亲茅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狗准。 梳的紋絲不亂的頭發(fā)上克锣,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音腔长,去河邊找鬼袭祟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捞附,可吹牛的內(nèi)容都是我干的巾乳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸟召,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胆绊!你這毒婦竟也來(lái)了玷室?” 一聲冷哼從身側(cè)響起寓辱,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甫窟,沒(méi)想到半個(gè)月后跟继,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體种冬,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年舔糖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碌廓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剩盒,死狀恐怖谷婆,靈堂內(nèi)的尸體忽然破棺而出慨蛙,到底是詐尸還是另有隱情,我是刑警寧澤纪挎,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布期贫,位于F島的核電站,受9級(jí)特大地震影響异袄,放射性物質(zhì)發(fā)生泄漏通砍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一烤蜕、第九天 我趴在偏房一處隱蔽的房頂上張望封孙。 院中可真熱鬧,春花似錦讽营、人聲如沸虎忌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膜蠢。三九已至,卻和暖如春莉兰,著一層夾襖步出監(jiān)牢的瞬間挑围,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工糖荒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杉辙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓捶朵,卻偏偏與公主長(zhǎng)得像蜘矢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泉孩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.提取圖片 [D 160418 15:31:06 connectionpool:383] "POST /math...
    瀟湘陽(yáng)陽(yáng)閱讀 822評(píng)論 2 0
  • 微信小程序游戲類(lèi)demo:識(shí)色;從相似顏色中挑選不同的一個(gè)源碼鏈接:http://www.wxapp-union....
    神木驚蟄閱讀 4,002評(píng)論 0 6
  • 今天就要教給大家一個(gè)健康生活必備技能——學(xué)會(huì)看食物包裝上的營(yíng)養(yǎng)標(biāo)簽并淋。 1.營(yíng)養(yǎng)標(biāo)簽 在我國(guó)寓搬,從2013年1月1日施...
    猴得柱閱讀 559評(píng)論 0 2
  • 海風(fēng)徐徐而來(lái),紅燈籠隨風(fēng)搖擺县耽,蕩漾在街道中句喷,偶有炮竹聲打破夜的寧?kù)o,在星空下絢麗綻放兔毙,才讓人記得唾琼,現(xiàn)在正式2015...
    洋泡泡閱讀 917評(píng)論 2 17
  • 畢業(yè)大半年了,工作過(guò)兩三個(gè)月澎剥,發(fā)現(xiàn)自己還是喜歡學(xué)習(xí)锡溯。于是辭去了銷(xiāo)售助理的工作,在培訓(xùn)機(jī)構(gòu)學(xué)軟件。 剛從...
    craky偷書(shū)賊閱讀 111評(píng)論 0 0