Swift能代替Objective-C嗎?
我文章的中心是,以 Apple 目前給出的各種資料來(lái)看,這語(yǔ)言不會(huì)替代掉ObjC,它不是下一代的ObjC。它有很多缺點(diǎn),使得它不足以做大型項(xiàng)目。這些缺點(diǎn)使得,Apple 自己都沒(méi)有使用它做 Mac/iOS 的 app。我不排除明年后年它有很大改進(jìn),但至少現(xiàn)在還沒(méi)有這端倪。
因此,如果你會(huì)ObjC,你不需要去看它。
但你如果問(wèn)我這語(yǔ)言對(duì)普通開(kāi)發(fā)者重要不重要,我說(shuō)重要,可以明確告訴你這一點(diǎn)--它是 Apple 在 WWDC 向全世界推出的重磅語(yǔ)言我怎麼能說(shuō)它不重要? 它降低了入門(mén)的門(mén)檻。使得大量的 JS, Python, Ruby用戶會(huì)使用 Apple 的技術(shù)為其開(kāi)發(fā)程序。它的作用,和 Core Data, Interface Builder 一樣,能讓你快速寫(xiě)出一個(gè)能用的程序來(lái)。但如果你想稍做些正經(jīng)事,就心有馀力不足了。所以和 Apple 自己的 Mail 也不會(huì)去用 Core Data,自己 iPhoto 不會(huì)去用 UICollectionView,稍複雜的 App 都不會(huì)去用 Interface Builder 一樣,Apple 自己不會(huì)用 Swift。它只是給三五個(gè)人的小團(tuán)隊(duì)能迅速做出能用的程序,讓大公司能快速做些 Prototype 而已。
====
有人說(shuō)它相當(dāng)于 C#,或是相當(dāng)于 Scala 對(duì) Java 的改進(jìn),我可以告訴大家,Swift 不是這樣的語(yǔ)言。它更像一種讓人快速做原型的 toy language。
要求 Apple 發(fā)佈下一代 Objective-C 語(yǔ)言的呼聲早就有了,每年寫(xiě)數(shù)萬(wàn)字 OS X 評(píng)論的 Ars Technica 兩年前就寫(xiě)了 Apple 應(yīng)該去做一個(gè)語(yǔ)言,Objective-C without C 并且使用更現(xiàn)代的功能和更短的 API,以及對(duì)自動(dòng)類(lèi)型推導(dǎo)的支持,文章見(jiàn) OS X 10.8 Mountain Lion: the Ars Technica review 。
但 Apple 顯然沒(méi)有認(rèn)真對(duì)待這門(mén)語(yǔ)言。很明顯的,他們根本不想把ObjC給替換掉。并且按Apple的風(fēng)格,如果他們把Swift當(dāng)ObjC的未來(lái)來(lái)對(duì)待,肯定會(huì)有一到兩個(gè)iOS/Mac應(yīng)用使用Swift改寫(xiě)。(比如Apple 當(dāng)年要砍 Carbon,首先做的就是把 Finder 重寫(xiě)了)。
從語(yǔ)言角度,Swift 有太多的缺點(diǎn):
它的標(biāo)準(zhǔn)庫(kù)太差,只有Dictionary, Array 和 String及數(shù)這幾種數(shù)據(jù)結(jié)構(gòu),連個(gè) Set 都沒(méi)有。想用別的?你還是要用 ObjC 的。是的,當(dāng)你用原生數(shù)據(jù)結(jié)構(gòu)時(shí),速度比ObjC快。但是那僅限于那幾個(gè)。 它沒(méi)有任何對(duì)異步/同步編程的支持。它沒(méi)法綁定使用 Grand Central Dispatch,因此任何正經(jīng)的網(wǎng)絡(luò)應(yīng)用根本無(wú)法編寫(xiě)。
它沒(méi)有任何的保護(hù)機(jī)制(private, protected),所有的 method和 variable 都是全局可見(jiàn)的,這顯然不能滿足正經(jīng)工程項(xiàng)目的需要。
只能和 ObjC 互動(dòng)。如果你想正經(jīng)地使用C或者C++,你得寫(xiě) ObjC 的 wrapper。這基本限制了你使用大量的 C/C++ 庫(kù)函數(shù)。
沒(méi)有辦法 catch Objective-C 的 exception,如果一旦出了 exception,你的 App 立馬就崩了。這也基本限制了你使用很多 ObjC 舊代碼庫(kù)。
Chris 在設(shè)計(jì)這門(mén)語(yǔ)言時(shí),可以明顯地看到他的短視。這也很正常,他是一個(gè)做編譯器的,不是做語(yǔ)言研究的。所以這門(mén)聲稱(chēng)支持函數(shù)式編程的語(yǔ)言,根本沒(méi)有大多函數(shù)式語(yǔ)言都普遍存在的功能:
僅有的支持在lazy,閉包,及簡(jiǎn)單的函數(shù)語(yǔ)言函數(shù)(如map, filter)。這ObjC中都能做
沒(méi)有pattern matching
類(lèi)型推導(dǎo)差不多和 C++11 差不多,沒(méi)有使用hindley milner
從上面這些特點(diǎn)看, Apple對(duì)其的定位僅是給對(duì)ObjC頭疼的開(kāi)發(fā)者降低學(xué)習(xí)曲線所推出的玩具語(yǔ)言。前面五條中的每一條,基本都是致命的,因此 Apple 自己的項(xiàng)目也不會(huì)使用。做個(gè)早期 proof of concept的 prototype 到是可以的。
我可以想象,實(shí)現(xiàn)上 Swift 是很簡(jiǎn)單的(LLVM很成熟了,寫(xiě)個(gè)新語(yǔ)言越來(lái)越簡(jiǎn)單,比如只要幾步就能做個(gè)小語(yǔ)言: 1. Kaleidoscope: Tutorial Introduction and the Lexer),當(dāng)然有可能 Apple 將來(lái)會(huì)解決這些問(wèn)題使得其真正實(shí)用。但現(xiàn)在來(lái)看,Apple 并不希望 Swift 來(lái)替代 Objective C。
相關(guān)文章
解析Swift語(yǔ)言面相對(duì)象編程中的繼承特性
這篇文章主要介紹了解析Swift語(yǔ)言面相對(duì)象編程中的繼承特性,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11Swift中switch語(yǔ)句區(qū)間和元組模式匹配
這篇文章主要介紹了Swift中switch語(yǔ)句區(qū)間和元組模式匹配的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12Swift算法之棧和隊(duì)列的實(shí)現(xiàn)方法示例
Swift語(yǔ)言中沒(méi)有內(nèi)設(shè)的棧和隊(duì)列,很多擴(kuò)展庫(kù)中使用Generic Type來(lái)實(shí)現(xiàn)?;蚴顷?duì)列。下面這篇文章就來(lái)給大家詳細(xì)介紹了Swift算法之棧和隊(duì)列的實(shí)現(xiàn)方法,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-03-03Swift 5.1 之類(lèi)型轉(zhuǎn)換與模式匹配的教程詳解
這篇文章主要介紹了Swift 5.1 之類(lèi)型轉(zhuǎn)換與模式匹配的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05RxSwift實(shí)現(xiàn)替換delegate的方法示例
這篇文章主要給大家介紹了關(guān)于RxSwift實(shí)現(xiàn)替換delegate的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用RxSwift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Swift設(shè)置UILabel內(nèi)邊距的實(shí)例代碼
有時(shí)候,我們需要一個(gè)顯示文字,又想這些文字與邊界之間有自定義的邊距,所以下面這篇文章主要給大家介紹了關(guān)于Swift設(shè)置UILabel內(nèi)邊距的相關(guān)資料,需要的朋友可以參考下2021-10-10Swift中類(lèi)與結(jié)構(gòu)的初始化示例解析
這篇文章主要為大家介紹了Swift中類(lèi)與結(jié)構(gòu)的初始化解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03