一名來自中國的iOS/Unity開發者:對Swift 的一點初步看法
雖然四點半就起床去排隊等入場,結果還是只能坐在了蠻后面的位置看著大屏幕參加了今年的 Keynote。其實今年 OS X 和 iOS 的更新亮點都不少,但是顯然風頭和光芒都讓橫空出世的 Swift 給搶走了。這部分內容因為不是 NDA,所以可以提前說一說。
Swift 是 Apple 自創的一門專門為 Cocoa 和 CocoaTouch 設計的語言,意在用來替代 objc。早上發布的時候有很多朋友說其實他們已經寫了很久的 Swift,而且還給了一個網站,在這里首先需要說明的是,這個網站的 Swift parallel scripting language 和 Apple 的 Swift 并不是一個東西,兩者可以說毫無關系。Apple 還在自己的 Swift 介紹頁面后面很友好地放上了 Swift parallel scripting language 的網站鏈接,以提示那些真的想搜另一個 Swift 卻被 SEO 誤導過來的可憐的孩子。
我個人來說,在把玩了 Swift 幾個小時之后,深深地喜歡上了這門新的語言。這篇文章以一個初學者(其實現在大家都是初學者)的角度來對 Swift 做一個簡單的介紹,因為現在大家其實是在同一個起跑線上,所以理解上可能會有很多不精確的地方,出錯了也請大家輕噴指正!
什么是 Swift
很多人在看到 Swift 第一眼的感覺是,這丫是個腳本語言啊。因為在很多語法特性上 Swift 確實和一些腳本非常相似。但是首先需要明確的是,至少在 Apple 開發中,Swift 不是以一種腳本語言來運行的,所有的 Swift 代碼都將被 LLVM 編譯為 native code,以極高的效率運行。按照官方今天給出的 benchmark 數據,運行時比 Python 快 9 倍,比 objc 快 3 倍左右(有可能記錯)。我相信官方數據肯定是有些水分,但是即使這樣,Swift 也給人帶來很多遐想和期待。Swift 和原來的 objc 一樣,是類型安全的語言,變量和方法都有明確的返回,并且變量在使用前需要進行初始化。而在語法方面,Swift 遷移到了業界公認的非常先進的語法體系,其中包含了閉包,多返回,泛型和大量的函數式編程的理念,函數也終于成為一等公民可以作為變量保存了(雖然具體實 現和用法上來看和 js 那種傳統意義的好像不太一樣)。初步看下來語法上借鑒了很多 Ruby 的人性化的設計,但是借助于 Apple 自己手中強大的 LLVM,性能上必須要甩開 Ruby 不止一兩個量級。
另一方面,Swift 的代碼又是可以 Interactive 來“解釋”執行的。新的 Xcode 中加入了所謂的 Playground 來對開發者輸入的 Swift 代碼進行交互式的相應,開發者也可是使用 swift 的命令行工具來交互式地執行 swift 語句。細心的朋友可能注意到了,我在這里把“解釋”兩個字打上了雙引號。這是因為即使在命令行中, Swift 其實也不是被解釋執行的,而是在每個指令后進對從開始以來的 swift 代碼行了一遍編譯,然后執行的。這樣的做法下依然可以讓人“感到”是在做交互解釋執行,這門語言的編譯速度和優化水平,可見一斑。同時 Playground 還順便記錄了每條語句的執行時候的各種情況,叫做一組 timeline。可以使用 timeline 對代碼的執行逐步檢查,省去了斷點 debug 的時間,也非常方便。
至于更詳細的比如 Swift 的語法之類的,可以參見 Apple 在 iBooks 放出的 The Swift Programming Language,或者你是開發者的話,也可以看看 pre-release 的參考文檔
Cool,我可以現在就使用 Swift 么?
Swift 作為 Apple 欽定的 objc 的繼承者,作為 iOS/Mac 開發者的話,是覺得必須和值得學習和使用的。現在 Swift 可以和原來的 objc 或者 c 系的代碼混用(注意,不同于 objc 和 c++ 或者 c 在同一個 .mm 文件中的混編,swift 文件不能和 objc 代碼寫在同一個文件中,你需要將兩種代碼分開)。編譯出來的二進制文件是可以運行在 iOS 7 和 iOS 8 的設備上的(iOS 6 及之前的是不支持的)。雖然我沒有嘗試過,但是使用新的 clang 對 swift 進行編譯的 app 二進制包,只要你的 target 是 iOS 7 及以上的話,應該現在就可以往 App Store 進行提交。
一個很好的消息是 Xcode 6 中應該是所有的文檔都有 objc 和 swift 兩種語言版本了,所以在文檔支持上應該不是問題。而按照 Apple 開發者社區的一貫的跟進速度,有理由相信在不久的將來,Apple 很可能會果斷 drop 掉 objc 的支持,而全面轉向 swift。所以,關于標題里的這個問題的答案,我個人的建議是,盡快學習,盡快開始使用。如果你有一定的腳本語言的基礎(Ruby 最好,Python 或者 JS 什么的也很不錯),又比較了解 Cocoa 框架的思想的話,轉型到新的語言應該完全不是問題。你會發現以前很多 objc 實現起來很郁悶的事情,在新語言下都易如反掌。我毫不忌諱地說,在 Apple 無數工程師和語言設計天才的努力下,Swift 吸收了眾多語言的精華,應該是現在這個世界上最新(這不是廢話么),也是最先進的一門編程語言(之一)了。而我認為,也正是 Apple 對這門語言有這樣的自信,才會在這么一個可以說公司還在全盛的時候,不守陳規、如此大膽地進行語言的更換。因為 Apple 必定比你我都精于算計,切換語言帶來的利益必須遠大于弊端,才會值得冒如此大的風險。在這個意義上來說,今天的發布會就是程序開發業界的一枚重磅炸彈,也 必將寫入史冊,而你我其實真的身在其中,變成了這段歷史的見證者。
如何開始?
很簡單,雖然歷年的 WWDC 都在 NDA 的控制之下使得我們無法討論過多的內容,但是這次的 Swift 破天荒地是在 NDA 之外的內容。Apple 已經放出了足夠多的資源讓我們開始學習。首先是官方的 Swift 的介紹頁面,你可以了解一些 Swift 的基本特性和細節。然后就是從 iBooks 下載 Swift 的書籍。你可以不必通讀全書,而只需要快速瀏覽一下 35 頁之前的 Tour 部分的內容,就可以開始將其運用到開發中了。因為不受 NDA 限制,所以 StackOverflow 的 swift 標簽和 Google 上應該會馬上充斥滿相關的問題和內容。及時跟進,相信和其他開發者一同從零開始學習和進步,你會很快上手并熟練使用 Swift 進行開發。
(因為真的,太好用了。你很難想象我在寫一個漂亮的閉包或者嵌套函數或者多返回時,那種內心的激動和喜悅...)
總結
這次的 WWDC 可以說是 Apple 之前幾年布局的一個匯總和爆發。從一開始的 Mac 整合電話和短信,以及無處不在的 Handoff,到后面的通知中心 widget 和系統 framework 的 extension,以及更甚的 Family Share 等等,可以說 Apple 通過自己對產業鏈的控制和生態圈的完善,讓 iDevice 或者 Mac 的用戶粘度得到了前所未有的加強。對一個人來說,可能一臺蘋果設備之后他會很容易購買第二臺第三臺;對于一家人來說,可能一個成員擁有蘋果設備之后,其他 人也會被宣傳和便捷帶動。這是一手妙招,也是 Apple 最近幾年一直在做的趨勢。
羅馬其實不是一天建成的,在開發語言方面,Apple 其實也精心打造了很多年。在語言而言,之前完全沒有這方面經驗的蘋果,毅然決然地選擇離開 GCC 陣營,另起爐灶自己弄 Clang 和 LLVM 的布局,而終于在幾年來對 objc 小修小補之后來了一次革命性的爆發。在日進萬金的大好時候,拋棄一個成熟開發社區,而轉向一種新的編程語言,做出這種決策,只能說這家公司的魄力讓人折服 和欽佩。另一方面,Apple 這么做的另一個理由應該是吸引更多的開發者加入到 Apple 開發陣營,因為相對于 objc 的語法和學習曲線,Swift 顯然要容易很多,對于其他陣營的開發者,這也會是一個很好的入場機會。正應了這次 WWDC 的宣傳語,Apple 已經為我們提供了更好的工具,我們有什么理由不繼續我們的征途,實現我們的夢想呢?
Write the code. Change the world.
<span id="shareA4" class="fl">
</span>