相信沒有人會懷疑,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 提出的編程範式,強大的表達力和抽象能力,毫無疑問會變成一項重要工具。而這二者的結合則是一種全新的體驗,這也是我此次分享的一個重要部分。spa
同時,因爲 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 客戶端的應用之類。