技術控眼里的Swift語言:誰說0基礎?

jopen 10年前發布 | 13K 次閱讀 Swift

技術控眼里的Swift語言:誰說0基礎?

        知乎 ios 開發黃兢成:有些人學 Swift 語言特別快,因為之前的基礎好。語言的語法只是表面,表面的東西總是變動得比較快的。底下的東西重要得多,而看不見,說它 0 基礎的人完全菜鳥。

        swift 跟 objc 共用同一套的運行時環境

        swift 的類型,可以橋接到 objc 的類型,反之亦然。如 string 對應原來 objc 的 NSString, closures 對應 objc 的 block,等等。objc 積累下來的大量庫,實現不用改寫,swift 就直接可以使用。(最多加個聲明文件)。

        看兩個 API 的聲明,對比一下:

objc
void
dispatch_apply (size_t iterations, dispatch_queue_t queue,
void (^block)(size_t));
- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *)event;
swift
func dispatch_apply (iterations: UInt, queue: dispatch_queue_t!, block: ((UInt) -> Void)!)
func touchesBegan (touches: NSSet!, withEvent event: UIEvent!)

        我懷疑,swift 中的接口文件,是利用原來 objc,c中的接口文件自動程序生成的。同一個工程,可以同時使用 swift, objc, c, c++ 四種編譯語言(額外嵌入的腳本語言另算),原來的 iOS/Mac 工程,已經可以同時使用 objc, c, C++三種語言。現在支持第四種。objc, c, c++ 三種語言的結合很容易, objc 跟c本身就兼容,objc 跟c++結合只要將文件名改成 .mm。而 swift 跟其它語言的結合,需要另外的文件進行橋接,其實也挺方便的。

        這里的橋接很容易,Apple 自家的各種 C 庫移植過來了。比如 Core Image/Audio,直接包含

import CoreAudio
import CoreImage

        就可以使用了。

        現在 swift 完全可以跟 objc 并存,原來的工程不建議重寫,也不用重寫。順其自然,慢慢讓它進化就是了。

        swift 寫法看起來像腳本語言,但它是真正的編譯語言

        初學者,看它使用了

let a = 4 var b = "hello"

        沒有類型定義,就想當然的覺得它是腳本語言,解釋執行,這是錯誤的。上面兩行語句是用了類型推導,類似 C++ 里面的 auto。swift 跟 objc 的運行時環境一樣,寫的程序跑起來不會比 objc 慢。swift 區分了 struct 和 class, 分別使用傳值跟傳引用。適當地使用 struct,應該會比 objc 要快一點。swift 吸收了很多其它語言的語法,寫起來比 objc 簡潔得多,不過它骨子里面的概念,跟原來 objc 差不多。

        編程語言的語法重要,但是語法背后的概念更重要

        比如面向對象,常用概念無非是,繼承,多態,封裝,信息隱藏等。繼承又可能分成多重繼承,接口繼承,實現繼承。或者還會有些嵌套類,嵌套函數等等。當明白語法背后的概念,知道為什么需要有這些東西。之后從一門語言切換到另一門有著相同概念的語言,其實很容易。

        而語法會影響表達,理論上每門語言都可以表達任何概念。不過當某種概念在某門語言中,很難表達出來,就會傾向于不這樣使用它,這種概念在那門語言的社區就難以被人熟知。

        感覺上,swift 有著 obj-c, C++, Ruby 的影子。

        最喜歡的 3 個特性

        tuple,終于可以返回多個數值了。一行交換兩個值。C++里面的 tie+tuple 也可以實現類似功能,不過使用庫,顯得噪音太多。

        closure,喜歡它的簡寫,還有在函數最后一參數,可以寫在()外面。這些特性,用來寫函數式風格的程序,會很好看。而原來 objc 的 block, 還有c++的 function, 就太啰嗦了。

        switch,case 里面的條件匹配。

        這些語法,編譯最后還是會映射成原來 objc 的運行模型。原來 objc 的概念,引用記數,ARC, 屬性,協議,接口,初始化,擴展類,匿名函數等等,繼續有效。

        swift 是 objc 的一塊大大的語法糖

        有個大塊頭的東西,是原來 objc 沒有的,就是泛型。swift 中將那種操作寫一次,就可以作用多個類型的語法叫做 generics(泛型),而 C++ 中稱為 template(模板),叫法不同,本質是同樣的東西。總的說來,swfit 涵蓋了現在流行的編程方式,結構化,面向對象,泛型,函數式。

        swift 的新語法,可以很好地支持內部 DSL

        有一種編程風格,不太好歸類。就是將程序拆分成,描述+解釋。解釋部分寫一次,其它地方使用描述式的語句,而不是命令式的語句。內部 DSL,通常利用主語言的語法特性,創出一套寫法,來寫一些描述性的語句。這些語句組合起來,就像一門新語言似得。這個比較難理解。舉個例子(從 ruby 那里借過來的),假如計算,幾小時之后的秒數。C語言中,大概會寫成

getHourSeconds (3)

        而現在 swift 中,只要定義了擴展

extension Int
{
var hours:Int
{return self * 3600 }
var ago:Int
{return -self
}
}

        就可以寫成

3.hours3.hours.ago

        分別是 3 小時后的秒數,3 小時前的秒數。

        同理,也可以寫成

10.days10.days.ago

        這種寫法,看起來跟原來的命令式寫法完全不同。這些程序是描述性的。原來的 objc, 做不到這點。 我估計 swift 以后會冒出大量這樣風格的庫。

        這種風格,到底好不好,要看情況。比較方便定義內部 DSL 的語言, 我自己知道的有C++, Ruby, Lisp。現在多了 Swift。

        認為所有人都是 0 基礎的,是錯誤的

        有些人學得特別快,因為之前的基礎好。語言的語法只是表面,表面的東西總是變動得比較快的。底下的東西重要得多,而看不見。水面一塊冰,有些人是冰山露出一角,有些人是無根的浮冰。看起來差不多,其實差別十分之大。

        我相信有些人,在兩個小時之內就可以使用這門新語言。

        提提那個 Playground

        之前蘋果的員工,Bret Victor 演講過個視頻。提到這個這種可視化編程。當我們每一步操作,都得到實時地反饋,我們的做法會有很多不同,做出的東西也會不同。這個 Playground,用來學習 swift 的特性很好用,不過我還不知道怎么才能跟工程結合起來使用,不作評論。

        現階段,我自己的做法

        我自己寫的新項目,將會有一部分使用 swift 來編寫。但還是會以 objc 為主。發覺現在 Xcode 6 beta 版本,對 swift 的語法提示支持不好,不能打幾個字母就自動完成。再觀察一陣子。我不敢展望太多,或者預測什么,通常提前預測都是錯的,會讓人抓住把柄。但感覺 Apple 發布 swift, 絕不是玩玩而已。

來自: game.163.com
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!