99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

[譯]Swift 的類(lèi)型體系

2018-06-19 15:04 更新

猛戳看最終版@SwiftGG

Brent Simmons 在 解決目前不存在的問(wèn)題,就好像問(wèn)題存在一樣 中說(shuō)到:

Swift 的類(lèi)型體系解決了我沒(méi)碰到的一個(gè)問(wèn)題。

對(duì)這句話(huà)我深有同感,而且我敢打賭很多其他的 Objective-C 開(kāi)發(fā)者也會(huì)這樣覺(jué)得。

在我剛開(kāi)始嘗試使用 Swift 時(shí),編譯器似乎經(jīng)常和我做對(duì) 1 。但隨著我對(duì)這門(mén)語(yǔ)言越來(lái)越熟悉,情況也隨之變得好起來(lái),但是有時(shí)它奇怪的錯(cuò)誤信息還是會(huì)讓我覺(jué)得它是一個(gè)難以取悅的任性小孩。

在這樣的情況下,Swift 嚴(yán)格的類(lèi)型檢查所帶給你的好處相比你為了讓代碼運(yùn)行所付出的努力就少之又少了。即便如此,它的類(lèi)型體系還是在去年成長(zhǎng)到了讓我再也不想錯(cuò)過(guò)它的程度。

Swift 更好理解

相比 Objective-C 我更喜歡 Swift 最大的原因不是他的類(lèi)型體系,而是一些更平凡的特性

  • 一等公民值類(lèi)型??梢园?integer 或者 struct 在不使用 object 包裝的情況下就放到 array 中,這可以說(shuō)是大贏,因?yàn)檫@意味著我們可以對(duì)這些類(lèi)型進(jìn)行擴(kuò)展。
  • 枚舉有關(guān)聯(lián)值。還有元組。在 Swift 中構(gòu)建數(shù)據(jù)結(jié)構(gòu)模型變得更加清晰。
  • 模式匹配。
  • 更清晰的語(yǔ)法且沒(méi)有頭文件。

簡(jiǎn)而言之,Swift 是現(xiàn)代語(yǔ)言,而 Objective-C 顯然不是。

如果 Apple 在去年發(fā)布了真正的 “Objective-C 3.0”,在保留 Obj-C 動(dòng)態(tài)特性的情況下使其現(xiàn)代化 2 ,我將會(huì)更加開(kāi)心并且可能永遠(yuǎn)不會(huì)主張更加靜態(tài)的類(lèi)型檢查。畢竟,“我知道我所做的事情,而且我永遠(yuǎn)不會(huì)因?yàn)閿?shù)組里面包含意外類(lèi)型而導(dǎo)致錯(cuò)誤?!?/p>

Hole-Driven 開(kāi)發(fā)

但是 Apple 給了我們 Swift, 而不是 Objective-C 3.0。Swift 的發(fā)布促使我去了解其他有同樣類(lèi)型體系的語(yǔ)言,比如 Haskell,ML 和 Scala。我從那些社區(qū)學(xué)到的特別的一點(diǎn)就是 hole-driven (或編譯驅(qū)動(dòng))開(kāi)發(fā) :不要把編譯器當(dāng)作需要你對(duì)抗的一股力量,而是把它當(dāng)作可以解決你問(wèn)題的一件神器,根據(jù)類(lèi)型一步一步滴來(lái)。

Hole-Driven 開(kāi)發(fā)在構(gòu)建數(shù)據(jù)結(jié)構(gòu)模型和數(shù)據(jù)轉(zhuǎn)換時(shí)可以說(shuō)是夢(mèng)幻般的技術(shù)( Haskell 和它的同類(lèi)尤其擅長(zhǎng)),而且盡管還有可提升的潛力,它在 Swift 中依然表現(xiàn)滴相當(dāng)棒。煩人的編譯器和有益的編譯器最關(guān)鍵的不同點(diǎn)在于它的錯(cuò)誤信息是不是易于理解,而很多 Swift 的診斷信息仍然相當(dāng)神秘 3

對(duì)于典型的 GUI 編程, 編譯驅(qū)動(dòng)開(kāi)發(fā)可能沒(méi)那么有用,盡管我認(rèn)為這主要?dú)w根于 Cocoa API 的設(shè)計(jì)而不是編譯驅(qū)動(dòng)開(kāi)發(fā)固有的限制。像 ReactiveCocoa 這樣的庫(kù)就向我們展示了類(lèi)型體系(在一定程度上說(shuō)應(yīng)該是清晰的語(yǔ)法)設(shè)計(jì)出來(lái)的 API 是什么樣的。當(dāng)你可以依賴(lài)一個(gè)幸虧有泛型的編譯器來(lái)做多步的 復(fù)雜信號(hào)變換 ,保證結(jié)果的正確性將會(huì)變得更加簡(jiǎn)單?,F(xiàn)在我發(fā)現(xiàn)在 Objective-C 中寫(xiě)這樣的代碼要難得多(隨后也更難理解),因?yàn)槲倚枰谖夷X海中記更多的東西。

自動(dòng)文檔

嚴(yán)格的類(lèi)型體系帶來(lái)的另外一個(gè)巨大好處就是做為副產(chǎn)品生成的自動(dòng)文檔。做為 Apple 平臺(tái)上的開(kāi)發(fā)者,我們?cè)L問(wèn)不到我們最常使用的庫(kù)的源代碼,所以我們需要依賴(lài)文檔。編譯器強(qiáng)制 API 設(shè)計(jì)者提供的信息越多,使用 API 的人就越方便。單可選注釋就給 Cocoa 的文檔提供了極大的提升 4 。想象一下如果所有 Cocoa 的 API 的方法參數(shù)和返回值類(lèi)型都是 id。頭文件基本上就沒(méi)什么用了。

總結(jié)

在強(qiáng)制我自己對(duì)類(lèi)型進(jìn)行非常仔細(xì)的思考之后,我發(fā)現(xiàn)我 Swift 代碼的設(shè)計(jì)更好了,也更容易維護(hù)了。我對(duì)我代碼的正確性也更加有自信了,而且更奇怪的是:寫(xiě)起來(lái)也更有趣了?。≒S:此處有強(qiáng)烈的補(bǔ)腎丸廣告即視感)

Swift 仍然在起步階段。有時(shí)它可能會(huì)讓你沮喪,但是隨著時(shí)間的推移編譯器提示的錯(cuò)誤信息會(huì)更友好,甚至可以讓你的代碼更加合理。比如說(shuō)我們都在糾結(jié)的一個(gè)例子,并發(fā):如果編譯器可以靜態(tài)滴證明你的多線(xiàn)程代碼不存在沖突,那就是一個(gè)巨大的優(yōu)勢(shì)。Swift 現(xiàn)在還不能做,但是 Rust 可以 。對(duì)次我相當(dāng)興奮。

<a name="1">1.這也是我覺(jué)得 Swift 果斷不是一門(mén)易學(xué)(易教)語(yǔ)言的原因之一。另外一個(gè)就是復(fù)雜的標(biāo)準(zhǔn)庫(kù)</a>

<a name="2">2.我們幾十年來(lái)都在使用“沒(méi)有 C 的 Objective-C”,而是以 Smalltalk 的形式</a>

<a name="3">3.毫無(wú)疑問(wèn),至少有一部分原因是我對(duì)語(yǔ)言比較陌生</a>

<a name="4">4.我需要提醒大家的是注釋是不保證正確性的,所以嚴(yán)格滴說(shuō)它們沒(méi)有頭文件注釋可靠。也許有人會(huì)認(rèn)為僅僅一個(gè)嚴(yán)格的編譯器就可以強(qiáng)制讓 Apple 的文檔更加精確。</a>

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)