引言
相信沒有人會(huì)懷疑毛萌,Swift 是 iOS 開發(fā)未來的主流語言阁将,但是由于 Swift 語言的不斷變化以及龐大的遷移成本做盅,真正把項(xiàng)目遷移到 Swift 語言的公司并不多吹榴。而猿題庫 iOS 客戶端是一個(gè)超過 3 年的項(xiàng)目帅刀,積累了超過 15 萬行的 Objective-C 代碼扣溺,我相信它在遷移過程中的經(jīng)驗(yàn)對(duì)很多人有所幫助锥余。
藍(lán)晨鈺(@晨鈺Lancy)是猿題庫 iOS 客戶端的負(fù)責(zé)人哈恰,他主導(dǎo)了猿題庫 iOS 客戶端從 Objective-C 到 Swift 的遷移工作蛔钙。同時(shí)他在實(shí)踐 Swift 的過程中吁脱,總結(jié)了不少心得兼贡,這次他將會(huì)在 GMTC 大會(huì)上分享這方面的話題遍希,以下是我對(duì)他的采訪,希望對(duì)大家有幫助废封。
提問
問題:向讀者簡(jiǎn)單介紹一下自己吧漂洋。
我叫藍(lán)晨鈺,iOS 開發(fā)者爽冕,11 年開始接觸 iOS 開發(fā)颈畸,13 年加入猿題庫負(fù)責(zé) iOS 客戶端開發(fā)工作眯娱,和猿題庫一起經(jīng)歷了從無到擁有數(shù)千萬用戶的成長(zhǎng)试伙,和我的團(tuán)隊(duì)一起完成了數(shù)十個(gè)版本的迭代疏叨。
我從 14 年底 Apple 發(fā)布 Swift 語言開始一直關(guān)注和學(xué)習(xí)其知識(shí)理念蚤蔓,并在 15 年初在公司推廣和實(shí)踐 Swift 項(xiàng)目,至今在生產(chǎn)環(huán)境實(shí)踐 Swift 已經(jīng)超過一年吐辙,算是有比較豐富的移動(dòng)客戶端開發(fā)經(jīng)驗(yàn)和 Swift 編程經(jīng)驗(yàn)吧昏苏。個(gè)人對(duì) Swift 語言的持樂觀態(tài)度,在公司內(nèi)積極推進(jìn) Swift 語言的實(shí)踐,也非常享受 Swift 的編程體驗(yàn)句柠。
問題:聽說你這次打算在 GMTC 上分享的話題是:《當(dāng)泛型遇上協(xié)議 —— Generic Programming with Protcol in Swift》,能簡(jiǎn)單介紹一下為什么選這個(gè)主題嗎谜酒?
泛型編程和面向協(xié)議編程都是 Objective-C 語言所沒有的特性僻族,作為一個(gè)老 iOS 開發(fā)者來說蝌数,當(dāng)我第一次接觸它們時(shí)顶伞,我的內(nèi)心是激動(dòng)的,我迫不及待的想知道锨咙,這些個(gè)新特性新技術(shù)蓖租,會(huì)給我們的程序和開發(fā)帶來怎么樣的變化。而經(jīng)過我們團(tuán)隊(duì)的不斷學(xué)習(xí)和實(shí)踐稠茂,我們也的確在這當(dāng)中找到了很多樂趣,積累了不少經(jīng)驗(yàn)电爹,我希望能通過這次分享講它們分享給更多人丐箩。
問題:你怎么看待泛型編程和面向協(xié)議編程在客戶端編程的未來?
泛型編程是許多現(xiàn)代語言所有的特性概漱,在其他語言的實(shí)踐經(jīng)驗(yàn)告訴我們竿裂,泛型是一個(gè)強(qiáng)大的工具铛绰,經(jīng)常能有效的提高編程效率和提高代碼的復(fù)用程度。面向協(xié)議編程則是由 Swift 提出的編程范式这嚣,強(qiáng)大的表達(dá)力和抽象能力姐帚,毫無疑問會(huì)變成一項(xiàng)重要工具。而這兩者的結(jié)合則是一種全新的體驗(yàn)九秀,這也是我這次分享的一個(gè)重要部分鼓蜒。
同時(shí),由于 Swift 語言缺乏類似 objc runtime 的機(jī)制畅厢,我認(rèn)為泛型編程和面向協(xié)議編程作為實(shí)現(xiàn)之前 runtime 所實(shí)現(xiàn)功能的替代,將越來越成為 iOS 開發(fā)者需要掌握的重要技能。
問題:猿題庫當(dāng)前對(duì) Swift 的使用到什么程度?已經(jīng)完全遷移到 Swift 了嗎庐杨?
猿題庫有兩個(gè)客戶端項(xiàng)目选调,分別是老師端和學(xué)生端,他們都是 Swift 和 Objective-C 混編的項(xiàng)目灵份,并沒有完全遷移到 Swift仁堪。其中猿題庫老師端是在 Swift 發(fā)布之后不久啟動(dòng)的項(xiàng)目,我們?cè)谶@個(gè)項(xiàng)目中開始推行 Swift 語言填渠,所以這個(gè)項(xiàng)目是一個(gè) Swift 語言為主的項(xiàng)目,Objective-C 部分主要為復(fù)用舊代碼氛什。
而猿題庫學(xué)生端是我們的主項(xiàng)目莺葫,這個(gè)項(xiàng)目從 iOS 5 時(shí)代開始,一直使用 Objective-C 編寫枪眉,直到近期 Swift 升到 2.x 之后捺檬,我們認(rèn)為 Swift 已經(jīng)足夠成熟,并且我們?cè)诶蠋煻酥蟹e累了足夠的經(jīng)驗(yàn)后才開始向 Swift 遷移的贸铜。目前學(xué)生端的項(xiàng)目中堡纬,大部分還是 Objective-C 語言實(shí)現(xiàn),但新實(shí)現(xiàn)的頁面和功能基本都使用 Swift 語言來編寫蒿秦。
問題:你認(rèn)為猿題庫大概還需要多長(zhǎng)時(shí)間能夠完全遷移到 Swift?
事實(shí)上烤镐,在生產(chǎn)環(huán)境中,幾乎沒有人愿意在收益甚微的情況下把 Objective-C 代碼重寫一次渤早,因?yàn)橹貙懸馕吨罅康难邪l(fā)資源和測(cè)試資源的消耗职车,而這基本不會(huì)產(chǎn)生實(shí)際意義上的產(chǎn)品收益。另外 Apple 在 Swift 和 Objective-C 的橋接上做了相當(dāng)多的努力鹊杖,大部分情況下悴灵,我們都可以不太費(fèi)力的在 Swift 中復(fù)用 Objective-C 代碼。
所以大部分公司的策略都會(huì)是新功能用 Swift 語言實(shí)現(xiàn)骂蓖,舊功能先維持現(xiàn)狀积瞒,等到產(chǎn)品變動(dòng)或是架構(gòu)變動(dòng)的時(shí)候再使用 Swift 語言實(shí)現(xiàn),這也是猿題庫所采用的策略登下。所以我想短時(shí)間內(nèi)不太可能完全遷移到 Swift 吧茫孔。如果非要說一個(gè)時(shí)間的話,我推測(cè)大約一年之后大部分業(yè)務(wù)應(yīng)該會(huì)遷移到 Swift被芳,而整個(gè)項(xiàng)目徹底遷移恐怕就需要兩到三年以上了缰贝。
問題:你認(rèn)為 Swift 什么時(shí)候能夠達(dá)到 ABI 穩(wěn)定?
老實(shí)說畔濒,我也不知道剩晴。Swift 的發(fā)展很快,我這次主題要講的泛型相關(guān)的實(shí)踐,在 Swift 1.x 的時(shí)候就沒法實(shí)現(xiàn)赞弥。Swift 項(xiàng)目組的 Chris Lattner 也公開表示 Swfit 3.0 不會(huì)達(dá)到 ABI 穩(wěn)定并且會(huì)缺少一些重要的泛型功能毅整。我們只能期待在 Swift 3.x 或 Swift 4 的時(shí)候會(huì)有驚喜吧。
問題:對(duì)比 Swift 和 Objective-C绽左,你覺得 Swift 最大的優(yōu)勢(shì)是什么悼嫉?
Swift 的優(yōu)勢(shì)有很多,我比較喜歡的有幾點(diǎn):更安全的類型拼窥,代表更少的 Bug 和更低的崩潰率戏蔑;更簡(jiǎn)潔的語法,代表更少的代碼和更快的編程速度闯团;強(qiáng)大的函數(shù)式辛臊、泛型、協(xié)議等特性房交,代表更能發(fā)揮程序員的想象力彻舰。選一個(gè)的話,我選最后一個(gè)候味,強(qiáng)大的特性給了我很大的編程愉悅感刃唤。
問題:對(duì)于從 Objective-C 遷移到 Swift,你有遇到什么值得分享的坑嗎白群?
從 Objective-C 遷移到 Swift 代表著在很長(zhǎng)一段時(shí)間內(nèi)都是處于混編的狀態(tài)尚胞,這里我認(rèn)為最重要的經(jīng)驗(yàn)是一定要有一個(gè)遷移的規(guī)范和指南來約束開發(fā)團(tuán)隊(duì)哪些部分需要遷移 Swift 而哪些部分不要,接口應(yīng)該如何設(shè)計(jì)才能兼顧混編調(diào)用帜慢。舉個(gè)例子笼裳,由于 Swift 調(diào)用 Objective-C 是方便的可靠的,反之則有許多的限制粱玲,所以設(shè)計(jì)接口的時(shí)候躬柬,需要考慮這個(gè)模塊會(huì)不會(huì)被 Objective-C 調(diào)用,如果是的話抽减,應(yīng)該避免使用 Swift 語言的特性允青,又或是制定一套規(guī)則,來 Swift 語言的接口如何轉(zhuǎn)成 Objective-C 兼容的接口卵沉。
問題:對(duì)于學(xué)習(xí) Swift颠锉,你有什么推薦的方法或資料嗎?
iBooks 上有 Apple 推出的 Swift Programming 系列書籍是所有 iOS 開發(fā)者的必讀和參考書目史汗。iTunes U 上有 Stanford 的 Developing iOS Apps with Swift琼掠,講師是 Apple 工程師 Paul Hegarty,推薦新入門的 iOS 開發(fā)者學(xué)習(xí)停撞。
Objc.io 上的 Advanced Swift 是我最近在讀的書瓷蛙,內(nèi)容絕對(duì)對(duì)得起 Advanced 這個(gè)詞,推薦有一定基礎(chǔ) Swift 開發(fā)者閱讀。此外 Github 上有大量的 Swift 開源項(xiàng)目速挑,可以閱讀源碼來學(xué)習(xí)。
最后副硅,也是最重要的姥宝,多寫,多想恐疲,實(shí)踐是最好的學(xué)習(xí)方式腊满。
問題:你對(duì)今年 WWDC 有什么期待嗎?
最大的期望是能去一次 WWDC(笑)培己,可惜我們公司每年到 6 月高考的時(shí)候就是最忙的時(shí)候碳蛋,所以這個(gè)愿望只能等以后了。對(duì) WWDC 本身的話省咨,期望 Apple 能弄出一些新東西肃弟,比如我很看好的虛擬現(xiàn)實(shí)相關(guān)的產(chǎn)品和技術(shù)。
另外希望 Apple 能加快 Swift 的推進(jìn)零蓉,比如發(fā)布與 Google 合作推進(jìn) Swift 語言在 Android 客戶端的應(yīng)用之類笤受。
原文鏈接:http://blog.devtang.com/2016/05/24/migrate-from-oc-to-swift/