Swift 4遷移總結(jié):喜憂參半万哪,新的起點(diǎn)

這次Swift 3 到 4 的遷移代碼要改動的地方比較少蟀瞧,花了一個(gè)下午的時(shí)間就完成了遷移。Swift 把原來 4.0 的目標(biāo)從 ABI 穩(wěn)定改為了源碼兼容,此次代碼的兼容性做的確實(shí)很好,這個(gè)目標(biāo)算是達(dá)到了。然而對于一個(gè)成熟的項(xiàng)目而言盟劫,單純語法上的兼容并不是全部,這次的升級也帶來了一些新的變化与纽。

3.2 和 4.0

在 3.0 的時(shí)候 swift 也提供了 2.3 和 3.0 兩個(gè)版本侣签,這次 4.0 也是提供了 3.2 版本塘装。從我項(xiàng)目里的代碼來看,從 3.0 到 3.2 要做的改動幾乎沒有影所,只是需要重新編譯一次蹦肴。社區(qū)的反應(yīng)來看兼容 3.2 也沒反饋出什么大的改動。所以對于推遲跟進(jìn) 4.0 的團(tuán)隊(duì)來言會是一個(gè)很順滑的過度猴娩,可以安心的切換到 Xcode 9阴幌。

為了讓大家在遷移過程中更加順利,swift 的 framework 支持 3.2 和 4.0 版本混編卷中。如果你有好幾個(gè)組件矛双,可以單獨(dú)為某個(gè)組件升級到 4.0 。這樣大的團(tuán)隊(duì)可以不用一口氣所有的代碼都遷移到 4.0蟆豫。
然而 3.2 和 4.0 的兼容并沒有看上去那么美好背零。


首先是cocoapods的問題,反正在目前pods的framework只能指定一個(gè)版本的swift无埃。issue在這里:Pods automatically compiling with Swift 4.0 in Xcode 9 beta 1 。pod默認(rèn)會使用一個(gè)swift版本編譯全部毛雇,需要對不同的庫單獨(dú)指定swift版本嫉称。

遇到這個(gè)問題后,我把所有組件都遷移到了 4.0 灵疮,app 因?yàn)橛泻芏鄻I(yè)務(wù)代碼织阅,希望先遷到 3.2 ,這樣可以盡早支持 Xcode 9震捣,同事可以盡早適配 iOS 11荔棉。然而。蒿赢。润樱。


Xcode 果然沒讓我失望啊,編譯的時(shí)候沒有錯(cuò)誤提示只告訴你失敗了:


compiling as Swift 3.2, with 'xxx' build as Swift 4.0(this is supported but may expose additional compiler issues)

提示也很清奇羡棵,我翻譯一下:我們雖然支持混編壹若,但是也可能混出毛病,所以你還是別混了皂冰。不過聽聞丁香園的項(xiàng)目目前是主 app 4.0店展,組件 3.2 混編是成功的。所以說呢秃流,如果要混可以碰碰運(yùn)氣赂蕴。

順便說下Xcode 9新的編譯系統(tǒng),我這里根本編譯不過(可能因?yàn)槲覀兓霴C舶胀?)概说,而且沒有任何錯(cuò)誤提示碧注。蘋果的軟件質(zhì)量果然是獨(dú)領(lǐng)風(fēng)騷,面向運(yùn)氣編程席怪。

社區(qū)跟進(jìn)及時(shí)

所以實(shí)際上应闯,你要不然就全不動,停在 3.2挂捻。一旦要遷移就需要全部遷移到 4.0 碉纺。

好在這次因?yàn)檎Z法改動小,我用到的大部分 Swift 庫都支持了 4.0刻撒。棄更的只有 DOFavoriteButton ,一個(gè)點(diǎn)贊的控件骨田。跟進(jìn)比較慢的有 RxGesture、EZSwiftExtensions声怔,不過已經(jīng)也有了 4.0 的分支态贤,也有人提了 4.0 的 PR,估計(jì)過幾天應(yīng)該也能合進(jìn)去醋火。只能說維護(hù)的人不夠積極悠汽。
下面把我用到的 pod 貼出來:

3.2 4.0
RxSwift/RxCocoa 4.0.0-beta.0
SnapKit 4.0.0
CryptoSwift 0.7.0 0.7.1
Alamofire 4.5.1 4.5.1兼容(5.0還未發(fā)布)
ObjectMapper 2.2.9 3.0
SwiftyAttributes 3.2.0 4.0.0
Kingfisher 4.1.0 4.0
MonkeyKing 1.4.0

通常情況下3.0是可以直接在3.2下編譯的,所以“無”并不表示不能使用芥驳,指開發(fā)者沒有單獨(dú)聲明一個(gè)版本兼容3.2柿冲。

4.0 開始與 OC 正式分道揚(yáng)鑣

為了照顧原有的開發(fā)者,Swift 2.0 的時(shí)候要做到的目標(biāo)是與 OC 盡量兼容兆旬,除了幾個(gè)基礎(chǔ)的數(shù)據(jù)類型比如 Int假抄、String 與OC不同外,其他的 API 都和 OC 保持一致丽猬,完全可以用 OC 的習(xí)慣寫 Swift 宿饱。到 3.0 的時(shí)候Swift 體系開始獨(dú)自進(jìn)化,開始有自己的命名規(guī)范脚祟。

到 4.0 的時(shí)候谬以,Xcode 用 Swift 重寫了編譯器,雖然 New build system 目前還在 preview由桌,也確實(shí)有很多問題蛉签,然而針對 Swift 的編譯優(yōu)化又取得了不小的提升。我已經(jīng)能感覺到蘋果想要拋棄 OC 的意思沥寥,至少是非常明顯的嫌棄的意思碍舍。

從代碼層面來看,原先一個(gè)類只要是 NSObject 的子類邑雅,默認(rèn)這個(gè)類的所有的屬性方法都會自動添加給 OC 調(diào)用的 bridge片橡,在 4.0 里這個(gè)功能被關(guān)閉了。這也是遷移 4.0 的一個(gè)比較大的工作量(對于和 OC 混編的項(xiàng)目)淮野。什么意思呢捧书,以前我們用 Swift 自定義了一個(gè)控件吹泡,原先在 OC 中引入 module 的頭文件后,可以調(diào)用到這個(gè)控件公開的所有屬性经瓷、方法爆哑。但是遷移到 4.0 后,所有屬性舆吮、方法默認(rèn)都是不能訪問到揭朝,需要到控件里給要暴露給 OC 使用的屬性方法前加上 @objc 。

這個(gè)改動影響非常深遠(yuǎn)色冀。這等于是讓開發(fā)者二選一了潭袱。如果我們用 Swift 寫一個(gè)組件,需要支持 OC 加上 @objc 標(biāo)志锋恬,編譯時(shí)就要生成給 OC 調(diào)用的聲明屯换,這降低了一些些性能。但是不加的話 OC 又調(diào)用不到与学。更深的原因是彤悔,在寫組件的時(shí)候我們并不確切的知道業(yè)務(wù)方是用 OC 還是 Swift 調(diào)用的。除非業(yè)務(wù)代碼全是 Swift索守≡我ぃ或者只能全盤做 OC 橋接,到處都是 @objc蕾盯,如果上面調(diào)用的是 Swift,這些又白加了蓝丙。

這里還出現(xiàn)了另外一個(gè)細(xì)節(jié)级遭。如果我們在 OC 里給 UIView 聲明了一個(gè)屬性 size,在 Swift 里也聲明了一個(gè)屬性 size渺尘。如果是在一個(gè) framework 里挫鸽,會編譯失敗提示沖突了。然而如果這兩個(gè)寫在不同的 framework 里鸥跟,Xcode 不會提示丢郊。在 8 的時(shí)候,這個(gè) size 的調(diào)用最后會走到 OC 的方法医咨,但是在 9 的時(shí)候枫匾,在 Swift 代碼里引入這個(gè) OC framework,代碼就直接崩潰了拟淮,會不知道應(yīng)該調(diào)用那個(gè)庫的 size干茉。這顯然是編譯器的一個(gè) bug,但這也側(cè)面反映了很泊,OC 和 Swift 混編帶來的問題越來越多角虫,兩個(gè)體系的區(qū)別會越來越大沾谓。

總結(jié)

遷移到 4.0 的代價(jià)比之前要小的多, ABI 穩(wěn)定很大可能在 5.0 到來戳鹅。對于觀望 Swift 是否穩(wěn)定的開發(fā)者而言是個(gè)好消息均驶,相信 Swift 的接受程度會更高。Swift 一年一個(gè)版本的升級和 OC 的分野會越來越大枫虏,給混編帶來了很多的不確定性妇穴,對于混編的項(xiàng)目有能力的還是把一些代碼遷移到 Swift。

對于 Xcode 我有一個(gè)經(jīng)驗(yàn)再次和大家分享一下:Xcode 有兩個(gè)版本模软,一個(gè)不穩(wěn)定的版本和一個(gè)更不穩(wěn)定的版本伟骨。

歡迎在社交網(wǎng)絡(luò)上關(guān)注我:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市燃异,隨后出現(xiàn)的幾起案子携狭,更是在濱河造成了極大的恐慌,老刑警劉巖回俐,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逛腿,死亡現(xiàn)場離奇詭異,居然都是意外死亡仅颇,警方通過查閱死者的電腦和手機(jī)单默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忘瓦,“玉大人搁廓,你說我怎么就攤上這事「ぃ” “怎么了境蜕?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凌停。 經(jīng)常有香客問我粱年,道長,這世上最難降的妖魔是什么罚拟? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任台诗,我火速辦了婚禮,結(jié)果婚禮上赐俗,老公的妹妹穿的比我還像新娘拉队。我一直安慰自己,他們只是感情好阻逮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布氏仗。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皆尔。 梳的紋絲不亂的頭發(fā)上呐舔,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音慷蠕,去河邊找鬼珊拼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛流炕,可吹牛的內(nèi)容都是我干的澎现。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼每辟,長吁一口氣:“原來是場噩夢啊……” “哼剑辫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渠欺,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤妹蔽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后挠将,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胳岂,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年舔稀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乳丰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡内贮,死狀恐怖产园,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夜郁,我是刑警寧澤什燕,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站拂酣,受9級特大地震影響秋冰,放射性物質(zhì)發(fā)生泄漏仲义。R本人自食惡果不足惜婶熬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埃撵。 院中可真熱鬧赵颅,春花似錦、人聲如沸暂刘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至募寨,卻和暖如春族展,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拔鹰。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工仪缸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人列肢。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓恰画,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓷马。 傳聞我的和親對象是個(gè)殘疾皇子拴还,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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

  • 這段日子,于我而言并非是個(gè)愜意非常的階段欧聘,有很多的大事件片林,又有不少小插曲,讓我的日常生活也是一波三折树瞭,有期待...
    吃面包的泡芙小姐閱讀 220評論 0 0
  • 最開始說把南大寶送進(jìn)托幼機(jī)構(gòu)的是爺爺拇厢,不是家里沒人帶孩子,純粹是為了培養(yǎng)他良好的生活習(xí)慣晒喷。大寶自出生后孝偎,大部分時(shí)間...
    南寶寶媽閱讀 354評論 0 0