有了Swift,iOS開發者為何仍需掌握Objective-C?
我記得很清楚,在 WWDC 2014 大會上,Apple 第一次宣布了一個為 iOS 準備的叫做 Swift 的新的編程語言。估計當時的參會者大多數都會有這樣的想法在大腦里閃過:
- 等等,這是蝦米?
- 天啊,我一直喜愛 Objective-C,但現在開始要學習一個新的語言了?
- 這是為 iOS 8 構建 App 的唯一方式?
之前有人問過這樣的問題:對于初學者,Objective-C 和 Swift,你推薦先學哪一個?
真正從長遠角度來看,學習 Objective-C 還是 Swift 語言其實很不重要。
Swift 剛發布的時候有人說“這下所有人都回到零起點了”,實際上是外行的一個常見的誤解。Swift / Objective-C 和 iOS 開發是兩個不同的概念,前者僅僅是一門編程語言,而后者則包括了編程思想、Cocoa 框架的使用,甚至交互設計規范、界面設計規范等 iOS 開發所需的一整套東西,并且絕大部分是和語言無關的。從學習的角度看,大部分時間你將花在學習后者上,而具體語言和語法只占很小的比例。 Objective-C 和 Swift 雖然語法上差異很大,但是背后的思想以及所依托的類庫都是相同的。關于 iOS 應用開發你能想到的絕大多數問題,例如:
- 一個應用的代碼是從哪里開始執行的?
- 如何建立一個按鈕,并實現用戶點擊這個按鈕之后調用一個函數?
- 如何修改一個標簽的文字?
- 如何控制系統發出聲音或者播放視頻?
- 如何檢測設備的朝向?
它們的答案都取決于 Cocoa 框架如何使用,而非具體采用的語言是什么——你關注的應該是背后的“我該做什么,為什么要這么做”,而不是簡單的“具體怎么去寫”——不同語言僅僅是一個寫法不同而已,手冊和網絡上都可以查到,用多了自然掌握。
因此,對于一個已經掌握了 Objective-C 和 iOS 開發的人,遷移到 Swift 是幾天就可以搞定的;而對于一個掌握了 Swift 和 iOS 開發的人,遷移到 Objective-C 也不會很困難。
至于選擇哪個語言,我想說 Swift 代替 Objective-C 肯定是有原因的,必須承認 Objective-C 的很多語法的確很怪很繁雜(Objective-C 的啰嗦是出了名的),可能對編程語言的初學者不太友好,Swift 接受起來會稍微容易一些。但另一個事實是,目前 Swift 的文檔、教程和代碼還比較少,并且大部分都是關于語法的。雖然有一兩個官方文檔是關于如何從 Objective-C 切換到 Swift 的,也有一些 Swift 的示例代碼,但和 iOS 開發這個龐大的體系比起來,覆蓋面仍然很窄。這對于已經掌握 Objective-C 的開發者不是問題,但是對于什么都不會的初學者,看過 Swift 的文檔之后能寫一個類似 C 的控制臺應用程序出來,但是很難寫一個你自己想要的完整可用的 iOS App 出來。因此,基于你的情況,我還是傾向于推薦從 Objective-C 開始學起。
有 Objective-C 開發經驗的開發者說
Apple 很快就將大部分的開發者聚集到一起,正如它很紳士的向大家介紹 Swift 并回答所有疑問那樣。Apple 向外承諾說,iOS 開發者使用 Swift 一定能從一個現代語言里獲得很多好處,包括像強類型化、類型推理、通用術語等等。這些功能都是 Objective-C 開發者一直感興趣的東西,但是有學習 Swift 編程語言需要花多少時間精力?
學習一個新的編程語言當然不會嚇到任何一個 Objective-C 開發者,但也并是說 Swift 里面的所有新的功能都很有吸引力的,更何況,Objective-C 在 2008 年 3 月 6 號就開始被用來構建 iPhone OS 里的移動 App 了。
上面所說到的都是有經驗的開發者,那么對于沒有 Objective-C 開發經驗的開發者來說,他們對這個新的編程語言是什么態度呢?
- 真走運,可以避開 Objective-C 的折磨了。
- 只是一個 .swift 文件,沒有標題或實現文件!太棒了!
- 插入語的山寨版大全終于要出來了。
這些新手也許話里話外都是在談論 Swift,最關鍵的是他們都很慶幸 Swift 終于可以在不久的將來完全替代相對復雜難懂的 Objective-C 了。
Swift 開發者說
下面這些是多維數組的 Objective-C 代碼片段,用 Xcode 輸出窗口展示出來的數值:
#import <Foundation/Foundation.h>int main () { /* an array with 5 rows and 2 columns*/ int a[5][2]-{{0,0},{1,2},{2,4},{3,6},{4,8}}; int i,j; /* output each array element's value*/ for(i=0;i<5;i++) { for(j=0;j<2;j++) { NSLOG (@"a[%d][%d]=%d\n",i,j,a[i][j]); } return 0; } }
輸出的結果是:
- a[0][0] = 0
- a[0][1] = 0
- a[1][0] = 1
- a[1][1] = 2
- a[2][0] = 2
- a[2][1] = 4
- a[3][0] = 3
- a[3][1] = 6
- a[4][0] = 4
- a[4][1] = 8
不知道你有沒有看到什么熟悉的東西,‘i’ 和 ‘j’ 代表的含義,還有循環。但是接下來的 ‘a’ 代表什么,或者 NSLog 是什么樣的語法?估計沒人想要寫這樣的代碼,不管我們想要得到什么,至少這就是我們暫時想要看到的。
Swift 發布之后,我為什么還要學習 Objective-C?
要想回答這個問題,就得先解決這些問題。調試一個麻煩的 bug。
你之前有在任何移動商店構建和發布過 App 嗎?如果有的話,你肯定在開發過程中遇到過較為嚴重的 bug 吧。反正我是遇到過的,大多數 bug 都是比較難纏的。無論你使用的是 Swift 還是 Objective-C 來編寫 App,底層框架都是用 Objective-C 寫的。缺陷深度的執行堆棧需要超過知識迅速的語言。要是在執行棧里遇到 bug 的話,必須對 Swift 語言相當了解才能將其解決。
我之前就用 Swift 編寫過一個 App,同時遇到了一個用于顯示數據的 TableView 上出現的問題,雖說這是一個不太復雜的問題,可是在我做了“優秀開發者”做的解決方案之后,還是沒辦法解決。然后在 Google 上尋找答案,雖然方法有很多,但是都只支持 Objective-C 代碼。不知道要多久才能出現包括 Swift 在內的解決方案?但是我們知道目前的開發者社區里 Objective-C 是通用語言。
iOS 開發者社區的通用語言是 Objective-C
歷史告訴我們,過渡是需要時間的。然而這個過渡時間需要多長,誰都說不準!在自動引用計數(ARC)發布之前,當看到‘release’和‘retain’的時候都會畏縮一陣子。在 Apple 發布一個過渡指導之后,開發者開始代替使用手動引用計數。
AutoLayout 怎么樣?很多開發這一開始的時候抱著試試看的態度使用,結果并沒有達到自己想要的效果,所以他們只能放棄,“等到下一個 Xcode 版本出來的時候再試試吧!”
Demo Code != Production Code
在 WWDC keynote 上面我們看到 Swift 的運行速度很快,但真的有那么快嗎?之后在各個博客頁上和 StackOverflow 出現了對比,用 Swift 構建各種產品。在現實情況下用 Swift 創建 App 的時候,其表現和 Objective-C 有哪些區別呢?隨著時間的推移,Swift 可能會更快,但我沒那么多時間去等。
Swift 一直在不斷的改進
Swift 知道自己的目標,但是沒什么可以擊敗自己老大哥 Objective-C 這么多年的經驗。如果你想要添加 C++ 代碼到一個 iOS App 里面,你還得了解 Objective-C。