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

