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