猿題庫從 Objective-C 到 Swift 的遷移

發表於2016-06-10

引言

相信沒有人會懷疑,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/

相關文章