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