互用性是讓 Swift 和 Objective-C 相接合的一種特性,使你能夠在一種語言編寫的文件中使用另一種語言。當你準備開始把 Swift 融入到你的開發流程中時,你應該懂得如何利用互用性來重新定義並提高你寫 Cocoa 應用的方案。
互用性很重要的一點就是允許你在寫 Swift 代碼時使用 Objective-C 的 API 接口。當你導入一個 Objective-C 框架後,你可以使用原生的 Swift 語法實例化它的 Class 並且與之交互。
Swift和Objective-C的聯係
蘋果一直在改進Objective-C,默認編譯器由GCC換成了LLVM,並先後加入literal、block、ARC、Module等特性。我認為最大的兩點改進為以下兩點。
1.ARC+弱引用,本質還是引用計數。但從人手調用retain、release,轉成編譯器自動插入代碼是個質的飛躍。
2.block+GCD,block引入函數式風格的代碼塊,而GCD則大大簡化了異步代碼編寫方式。
WWDC之後,我開始思考一個問題,蘋果為什麼不繼續改進Objective-C,而發布Swift這門新語言呢?這個問題隻有蘋果自己知道,其他人隻能猜測。
可能的原因有以下幾個方麵。
1.Swift表麵看起來很簡單,語法跟流行的C#、JavaScript、C++等語言相似,可以吸引更多的開發者。
2.Objective-C因為需要兼容C,所以限製了它的改進。而Swift沒有曆史包袱,可以自由采用最新的語言設計研究成果。
3.設計者的個人品位,Chris Lattner不習慣Objective-C的語法,就去設計了一個新的。當然,這是玩笑話,不要太當真。
Swift雖然是新語言,卻融合了Objective-C的很多特性。讀Swift的文檔會發現,Objective-C與Swift的聯係十分密切。Objective-C使用的很多底層技術,被應用到Swift中。
Swift與Objective-C共用同一套運行時環境
我們編寫程序,讓程序運行起來,被機器執行的代碼並非全部是由我們自己來編寫的。需要同時運行很多預先寫好的支持性的代碼,才能讓我們自己的代碼運行起來。程序並非單獨存在的,運行時處在一定的環境當中。我總聯想到很多小螞蟻在泥土上麵爬,而我自己寫的程序隻是其中的一隻。
Swift跟Objective-C編譯出的程序代碼運行在同一套運行環境上麵。Swift的類型可以橋接到Objective-C的類型,反之亦然。Swift編寫的代碼可以調用Objective-C編寫的代碼,反之也一樣。
Objective-C之前積累下來的大量類庫,實現不用改寫Swift就可以直接調用。
同一個工程,可以同時使用Swift和Objective-C
Objective-C在一端,Swift在另一端,兩端經中間文件進行橋接。橋接文件包含Objective-C的頭文件,編譯時自動轉成Swift可以識別的形式。Swift就可以使用Objective-C的類和它的函數。
在Swift的類中,加上@objc(類名)的字樣,Objective-C也可以使用Swift編寫的類。但Swift跟C++的相互調用,需要Objective-C來封裝。
總的來說,共同使用Swift和Objective-C/C++還算方便,但已不能將幾種語言的代碼,混寫在同一文件。大概是因為Swfit的語法不像Objective-C那樣獨特,混寫難以將Swift的代碼識別出來。
Swift骨子裏大多與Objective-C一樣
Objective-C出現過的絕大多數概念,比如引用記數、ARC、屬性、協議、接口、初始化、擴展類、命名參數、匿名函數等,在Swift中繼續有效(可能隻是換了個術語)。我自己將Swift看成是Objective-C的一塊大大的語法糖,其他人可能有不同感受。
Swift大多數概念與Objective-C一樣,也有些概念在Objective-C找不到對應,比如泛型。Swift中將那種操作寫一次就可以作用多個類型的語法叫做Generics(泛型)。
編程語言和語法
新語言出來時,總會有種聲音認為語言隻是工具,他們會覺得重要的是思想,而看輕工具的作用。認為編程語言是工具本身並沒有大錯,但語言並非普通的工具,而是思維工具,不能忽視語言對思維的影響。編程語言就如同數學符號,數學符號也是種思維工具,好的數學符號會幫助使用者思考,更奇妙的是似乎符號本身也會思考。用0~9這些阿拉伯數字進行計算時會感到一切都很自然,似乎數字本身在計算,而不是人在做計算。
盡管編程語言的語法很重要,但語法背後的概念更重要。當明白語法背後的概念後,從一門語言切換到另一門有著相同概念的語言會很容易。但語法會影響表達,理論上每門語言都可以表達任何概念。不過當某種概念在某門語言中很難表達出來時,我們就會傾向於不使用它,這種概念在那門語言的社區就難以被人熟知。
編程語言用來表達思路,表達起來是否自然是很重要的。最理想的是不多不少、剛剛好,寫起來自然,讀起來更需要自然。並非功能越多的語言越好,而是應該越能幫助思考,越容易表達思路的語言越好。
Swift背後的概念大多跟Objective-C差不多。但Swift吸收了很多其他語言的語法,同一個概念,寫起來比Objective-C簡潔得多、自然得多。從表達的角度來說,Swift比Objective-C優秀。
Swift的語法
蘋果出了本很不錯的語法教程來詳細描述Swift的語法。在這裏,我們隻挑一些有意思的點來討論。
140.5M / 09-05
76.4M / 03-25
55M / 06-05
237.9M / 04-13
900.9M / 03-02
96.2M / 07-06
311.2M / 07-06
335M / 07-06
200M / 07-06
413.8M / 07-06
484.7M / 09-27
165.4M / 09-05
353.9M / 06-05
131.8M / 04-13
195.6M / 03-03
45.6M / 09-08
665.2M / 07-06
2.84G / 07-06
93M / 07-06
338.3M / 07-06
1.38G / 07-26
488.3M / 07-16
109.8M / 06-03
142M / 01-08
1.2M / 11-23
548.8M / 04-13
1.6M / 04-13
1.48G / 03-18
646.6M / 03-03
133.7M / 03-03
110.5M / 09-05
33.4M / 09-05
325.8M / 08-12
60M / 04-29
254M / 04-25
659M / 04-23
1M / 12-26
253.4M / 12-08
253M / 12-08
1.19G / 11-16
369M / 09-22
181.5M / 09-22
201.2M / 09-05
488.3M / 07-16
248.9M / 12-08
248.9M / 12-08
100.6M / 03-06
148.9M / 03-06
1.12G / 07-06
1.25G / 07-06
1.76G / 09-22
1.92G / 04-17
116.2M / 04-10
201.5M / 04-13
7.31G / 07-01
94.3M / 07-06
2.48G / 07-06
7.63G / 07-06
1M / 07-06
778.1M / 07-06
561.8M / 07-11
72M / 07-06
548.7M / 07-06
1.00G / 07-06
9.13G / 07-06
126.2M / 07-06
72M / 07-06
105.1M / 07-06
132M / 07-06
132M / 07-06