第二章——介紹(Swift的特點)

bestswifter發表於2017-12-27

Swift既是一個高層的,也是一個底層的語言。 Swift允許你像寫Ruby和Python一樣用mapreduce,也允許你很容易的自定義高階函式。Swift還允許你一些“高速”程式碼,並直接編譯為基於當前平臺的二進位制碼。它具有和C語言一樣的高效能。最令我們激動,同時也是我們最佩服Swift的一點是,你可以同時做以上這些事。比如你呼叫陣列的map方法所產生的彙編程式碼,和直接用for迴圈產生的彙編程式碼是完全一樣的。

Swift是一個多範型語言。 你可以用它來寫物件導向的語言,還可以只用不可變數寫純函式式的程式碼,你還可以用指標運算完成某些不可避免的、具有C語言風格的程式碼。

Swift非常靈活。 在介紹《On Lisp》這本書時,Paul Graham寫道:

有經驗的Lisp程式設計師會根據情況拆分他們的程式碼。在遵守“由上至下(top-down)”規範的同時,他們還會採用一種叫做“由下至上(button-up)”的規範。這意味著改變語言本身來適應某個問題。在Lisp中,你不僅根據語言的特性寫程式碼解決問題,還根據問題的需要構建新的語言特性。比如你在程式設計的時候可能會想:“我要是有某個運算子就好了”,那你就去自己實現一個。然後你就會發現用一個新的運算子可以簡化程式另一個部分的設計。如此往復,你的程式和語言共同進化。

Swift和Lisp相隔很久了,但我們感覺Swift借鑑了Lisp這種“由下至上(button-up)”的程式設計思想,這讓寫出非常通用、具有高可重用性的底層基礎結構變得簡單。隨後,你可以把這些底層的基礎結構進行組合,得到更多特性,最後用於解決實際問題。

Swift的程式碼簡練又不失可讀性。 型別推斷功能省去了很多無用的型別定義,而這些型別定義其實很明顯可以根據上下文推斷出來。分號和一些幾乎沒有價值的插入語也沒有了。

Swift鼓勵你把更多的事情放在編譯期。 Swift會被編譯器優化,你也可以助力這一過程。

Swift儘可能保證安全性,除非你人為放棄這一特性。 這一點和C與C++不同(比如你隨便忘了些什麼,程式碼就很不安全了),和Java與Haskell也不相同(這些語言不管你願不願意,總是安全的)

Eric Lippert是C#的主要作者之一,他最近寫了他對於C#最後悔的的十件事,其中之一就是:

有時候你實現了某個特性,而這個特性只有構建了這個語言底層結構的專家才有把握用好。這樣的特性應該被醒目地標註為——“危險的”,因為它和另一個語言的某個特性太像了。

Eric指的是C#中的finalizers[1],它和C++的解構函式看上去非常類似,不過它根據垃圾回收器(跑在特定的垃圾回收執行緒)執行在一個不確定的時間(或許永遠都不執行)。而Swift是基於引用計數的,所以他的deinit方法的執行時間是完全確定的。

Swift深刻的體會到了這種情緒,因此,未定義的和不安全的行為預設是被避免的。距離來說,變數在它初始化前不能被使用,越界的陣列下表會觸發一個陷阱而不是直接訪問到記憶體中的垃圾值。

不過如果真的需要的話,你也有權選擇在Swift中寫一些“不安全的”程式碼,比如unsafeBitcast函式或UnsafeMutablePointer型別。極大的自由帶來極大的未知,你可以這麼寫:

let uhOh = someArray.withUnsafePointer { ptr in
// ptr只在block內部有效,不過你也可以把它傳到閉包外部
return ptr
}

// later
uhOh[10]
複製程式碼

這樣你就會得到一個未定義行為,不過你可別說沒人提醒過你。

Swift依然具有絕大多數OC的特性, 包括訊息傳送、執行時型別鑑定、KVO

Swift引入了很多OC不具備的功能。 這其中有些技術和OC的風格相容的不太好,有時候你會發現你在OC和Swift兩個世界中切換有些困難。我們儘可能地將OC和Swift無縫連線起來。

Swift是一個固執的語言。 它是型別安全的,沒有基礎型別的強制轉換。

#譯者注: [1]:原文節選的這段話內容太少,其完整背景是這樣的:C#的finalizers和C++的析構非常類似,很多人當做了解構函式的C#版本。但由於他們的實現完全不同,很多finalizers的用法會導致難以預料bug,只有真正瞭解C#原理的人才能正確的使用。所以作者本人對finalizers很後悔。參考資料:Sharp Regrets: Top 10 Worst C# Features

相關文章