猿題庫從 Objective-C 到 Swift 的遷移
相信沒有人會懷疑,Swift 是 iOS 開發未來的主流語言,但是由于 Swift 語言的不斷變化以及龐大的遷移成本,真正把項目遷移到 Swift 語言的公司并不多。而猿題庫 iOS 客戶端是一個超過 3 年的項目,積累了超過 15 萬行的 Objective-C 代碼,我相信它在遷移過程中的經驗對很多人有所幫助。
藍晨鈺(@晨鈺Lancy)是猿題庫 iOS 客戶端的負責人,他主導了猿題庫 iOS 客戶端從 Objective-C 到 Swift 的遷移工作。同時他在實踐 Swift 的過程中,總結了不少心得,這次他將會在 GMTC 大會上分享這方面的話題,以下是我對他的采訪,希望對大家有幫助。
提問
問題:向讀者簡單介紹一下自己吧。
我叫藍晨鈺,iOS 開發者,11 年開始接觸 iOS 開發,13 年加入猿題庫負責 iOS 客戶端開發工作,和猿題庫一起經歷了從無到擁有數千萬用戶的成長,和我的團隊一起完成了數十個版本的迭代。
我從 14 年底 Apple 發布 Swift 語言開始一直關注和學習其知識理念,并在 15 年初在公司推廣和實踐 Swift 項目,至今在生產環境實踐 Swift 已經超過一年,算是有比較豐富的移動客戶端開發經驗和 Swift 編程經驗吧。個人對 Swift 語言的持樂觀態度,在公司內積極推進 Swift 語言的實踐,也非常享受 Swift 的編程體驗。
問題:聽說你這次打算在 GMTC 上分享的話題是:《當泛型遇上協議 —— Generic Programming with Protcol in Swift》,能簡單介紹一下為什么選這個主題嗎?
泛型編程和面向協議編程都是 Objective-C 語言所沒有的特性,作為一個老 iOS 開發者來說,當我第一次接觸它們時,我的內心是激動的,我迫不及待的想知道,這些個新特性新技術,會給我們的程序和開發帶來怎么樣的變化。而經過我們團隊的不斷學習和實踐,我們也的確在這當中找到了很多樂趣,積累了不少經驗,我希望能通過這次分享講它們分享給更多人。
問題:你怎么看待泛型編程和面向協議編程在客戶端編程的未來?
泛型編程是許多現代語言所有的特性,在其他語言的實踐經驗告訴我們,泛型是一個強大的工具,經常能有效的提高編程效率和提高代碼的復用程度。面向協議編程則是由 Swift 提出的編程范式,強大的表達力和抽象能力,毫無疑問會變成一項重要工具。而這兩者的結合則是一種全新的體驗,這也是我這次分享的一個重要部分。
同時,由于 Swift 語言缺乏類似 objc runtime 的機制,我認為泛型編程和面向協議編程作為實現之前 runtime 所實現功能的替代,將越來越成為 iOS 開發者需要掌握的重要技能。
問題:猿題庫當前對 Swift 的使用到什么程度?已經完全遷移到 Swift 了嗎?
猿題庫有兩個客戶端項目,分別是老師端和學生端,他們都是 Swift 和 Objective-C 混編的項目,并沒有完全遷移到 Swift。其中猿題庫老師端是在 Swift 發布之后不久啟動的項目,我們在這個項目中開始推行 Swift 語言,所以這個項目是一個 Swift 語言為主的項目,Objective-C 部分主要為復用舊代碼。
而猿題庫學生端是我們的主項目,這個項目從 iOS 5 時代開始,一直使用 Objective-C 編寫,直到近期 Swift 升到 2.x 之后,我們認為 Swift 已經足夠成熟,并且我們在老師端中積累了足夠的經驗后才開始向 Swift 遷移的。目前學生端的項目中,大部分還是 Objective-C 語言實現,但新實現的頁面和功能基本都使用 Swift 語言來編寫。
問題:你認為猿題庫大概還需要多長時間能夠完全遷移到 Swift?
事實上,在生產環境中,幾乎沒有人愿意在收益甚微的情況下把 Objective-C 代碼重寫一次,因為重寫意味著大量的研發資源和測試資源的消耗,而這基本不會產生實際意義上的產品收益。另外 Apple 在 Swift 和 Objective-C 的橋接上做了相當多的努力,大部分情況下,我們都可以不太費力的在 Swift 中復用 Objective-C 代碼。
所以大部分公司的策略都會是新功能用 Swift 語言實現,舊功能先維持現狀,等到產品變動或是架構變動的時候再使用 Swift 語言實現,這也是猿題庫所采用的策略。所以我想短時間內不太可能完全遷移到 Swift 吧。如果非要說一個時間的話,我推測大約一年之后大部分業務應該會遷移到 Swift,而整個項目徹底遷移恐怕就需要兩到三年以上了。
問題:你認為 Swift 什么時候能夠達到 ABI 穩定?
老實說,我也不知道。Swift 的發展很快,我這次主題要講的泛型相關的實踐,在 Swift 1.x 的時候就沒法實現。Swift 項目組的 Chris Lattner 也公開表示 Swfit 3.0 不會達到 ABI 穩定并且會缺少一些重要的泛型功能。我們只能期待在 Swift 3.x 或 Swift 4 的時候會有驚喜吧。
問題:對比 Swift 和 Objective-C,你覺得 Swift 最大的優勢是什么?
Swift 的優勢有很多,我比較喜歡的有幾點:更安全的類型,代表更少的 Bug 和更低的崩潰率;更簡潔的語法,代表更少的代碼和更快的編程速度;強大的函數式、泛型、協議等特性,代表更能發揮程序員的想象力。選一個的話,我選最后一個,強大的特性給了我很大的編程愉悅感。
問題:對于從 Objective-C 遷移到 Swift,你有遇到什么值得分享的坑嗎?
從 Objective-C 遷移到 Swift 代表著在很長一段時間內都是處于混編的狀態,這里我認為最重要的經驗是一定要有一個遷移的規范和指南來約束開發團隊哪些部分需要遷移 Swift 而哪些部分不要,接口應該如何設計才能兼顧混編調用。舉個例子,由于 Swift 調用 Objective-C 是方便的可靠的,反之則有許多的限制,所以設計接口的時候,需要考慮這個模塊會不會被 Objective-C 調用,如果是的話,應該避免使用 Swift 語言的特性,又或是制定一套規則,來 Swift 語言的接口如何轉成 Objective-C 兼容的接口。
問題:對于學習 Swift,你有什么推薦的方法或資料嗎?
iBooks 上有 Apple 推出的 Swift Programming 系列書籍是所有 iOS 開發者的必讀和參考書目。iTunes U 上有 Stanford 的 Developing iOS Apps with Swift,講師是 Apple 工程師 Paul Hegarty,推薦新入門的 iOS 開發者學習。
Objc.io 上的 Advanced Swift 是我最近在讀的書,內容絕對對得起 Advanced 這個詞,推薦有一定基礎 Swift 開發者閱讀。此外 Github 上有大量的 Swift 開源項目,可以閱讀源碼來學習。
最后,也是最重要的,多寫,多想,實踐是最好的學習方式。
問題:你對今年 WWDC 有什么期待嗎?
最大的期望是能去一次 WWDC(笑),可惜我們公司每年到 6 月高考的時候就是最忙的時候,所以這個愿望只能等以后了。對 WWDC 本身的話,期望 Apple 能弄出一些新東西,比如我很看好的虛擬現實相關的產品和技術。
另外希望 Apple 能加快 Swift 的推進,比如發布與 Google 合作推進 Swift 語言在 Android 客戶端的應用之類。
全文完。
來自: http://blog.devtang.com/2016/05/24/migrate-from-oc-to-swift/