天天看點

raywenderlich.com的Swift程式設計風格指南

這個風格指南可能和你從其他地方看到的不同,我們的焦點主要集中在網際網路和文章上的可讀性,建立這個程式設計風格指南是為了保持我們的書籍、教程和入門工具包中代碼的優雅與一緻性------盡管我們有和許多不同的作者合作。

我們的首要目的是簡潔、可讀性和簡單。

對類、方法、變量等使用包含描述性的駝峰式(CamelCase)命名。類名和全局常量的所有首字母大寫,方法和變量名開始第一個字母小寫。

對于函數和init方法,所有的參數都要擁有一個有着良好命名的參數名,除非上下文已經很清晰了。如果在外部調用函數的時候包含了參數名,将會使函數調用更加易讀:

對于方法而言,按照Apple的習慣,在方法名裡引用第一個參數:

當我們在文章中需要引用方法的地方,要從調用者的角度包含所有必須的參數名。如果上下文很清晰,而且準确的方法簽名不重要時,你就能隻使用方法名。

從你自己的init方法實作中調用convertPointAt(column:row:)。

如果你實作了didSelectRowAtIndexPath,那麼記得在你完成工作後取消選擇行。

你不能直接調用dataSource的tableView(_:cellForRowAtIndexPath:) 。

Swift的類型都自動的有其子產品的命名空間,其結果是不用為了減少名稱沖突而必須使用字首。如果有兩個來自于不同子產品的名稱起了沖突,你可以通過在類型名稱前加上子產品名來消除兩者間的歧義:

你不應該為Swift類型加上字首。

如果你需要暴露一個Swift類型在Objective-C裡使用,你也能提供一個合适的字首,就像下面這樣:

使用2個空格來縮進,而不是用tab,這可以節省空間,并有助于防止換行。請務必在Xcode的偏好設定裡設定。

方法的大括号和其他語句的大括号(if / else / switch / while等等)總是和語句在同一行打開,在新的一行關閉。

在方法之間應該正好有一個空行,這能使結構看起來更加清晰。在方法内用空行分隔功能,但如果分隔成太多段的話,常常意味着你需要把一個方法重構成多個方法。

在需要的時候,用注釋來解釋一段特殊的代碼為什麼要這麼做,注釋必須保持更新或者幹脆删掉。

避免在代碼裡嵌入大塊注釋,應該讓代碼本身作為自己的文檔。

例外:這不适用于那些通過注釋來生成文檔的情況。

這裡有一個風格很好的定義類的例子:

上面的這個例子清楚地展示了以下規則:

為屬性、變量、常量、參數定義以及其他申明指定類型的時候,在冒号後面而不是前面增加一個空格,比如:x: Int 和 Circle: Shape。

對于多個變量,如果它們有相同的結構和上下文環境(比如x、y),則把它們定義在同一行。

縮進屬性(property)的getter/setter定義。

不要添加像interal這樣的預設修飾符,同樣的,當覆寫一個方法時,不要在方法上再次寫上它的通路修飾符。

避免使用self。因為Swift并不需要使用self來通路對象中的屬性或是調用對象的方法。

對于需要使用self的唯一原因是:在初始化一個類或結構體時,要差別開屬性和參數名的不同:

在一行中定義函數聲明(包括左括号):

對于擁有長簽名的函數,在合适的地方添加一個換行符,并為随後的幾行添加一個額外的縮進:

盡可能地使用尾随閉包文法(Trailing Closure Syntax)。在任何情況下,給閉包中的參數具有描述性的名稱:

對上下文清晰的單行表達式閉包,使用隐式的return:

如果可能的話, 總是使用Swift的原生類型。Swift提供了橋接(Bridging)到Objective-C的功能,在需要時你也能使用Objective-C的完整方法:

在使用Sprite Kit的代碼裡,使用CGFloat能使代碼更加簡潔,同時能避免太多的類型轉換。

常量使用let關鍵字定義,變量使用var關鍵字定義。用let适當地定義那些永遠不會被修改的值,你可能會是以發現你自己用let遠超過用var。

提示:一個技巧能幫助我們達到這個标準:把所有的東西都定義成常量,隻有當編譯器報錯時才将其替換為變量。

用?定義變量和方法的傳回值為optional,表示該值能夠接受nil。

如果你知道一個執行個體變量一定會在使用前被初始化,如viewDidLoad方法裡會設定所有的子視圖,你就能用 ! 對這個變量做隐式的拆包。

當通路一個optional的值時,如果該值隻通路一次,或者有太多的optioanl值關聯,那麼就用Optional Chaining:

如果想更友善的做一次拆包然後執行多個操作,用Optional Binding:

使用Swift原生的結構體初始化方式比以前的CGGeometry構造方式要好。

Swift編譯器能夠推斷出變量和常量的資料類型。你可以通過提供類型别名(就是冒号後面的)來顯式聲明資料類型,但大多數情況下不需要這麼做。

我們喜歡簡明扼要的代碼,讓編譯器去推斷變量和常量的類型吧。

(在某些情況下可能需要顯式聲明,比如你對一個變量賦一個浮點型,Swift會将這個變量推斷為double,而不是float,如果你一定要用float,就隻能顯式聲明了)

備注:按照本原則:取一個具有描述性的名字比什麼都要重要。

定義泛型類型時使用快捷方式比使用完整文法要更好。

for-in比完整的for-condition-increment樣式要好:

Swift不再需要你的每一行代碼後面加上分号,隻要當你想把多條語句放在同一行的時候才是必須的。

不要把多條語句用分号分隔寫在一行。

隻有一種例外情況:構造for-condition-increment的時候必須用分号。然而,盡可能地使用for-in循環。

備注:Swift與JavaScript有很大不同,在JavaScript裡省略分号通常被認為是不安全的。

使用美式英語去适應Apple的API。

笑臉是raywenderlick.com網站很突出的特色功能!正确的笑臉意味着對程式設計有着無比的快樂與興奮,這是非常重要的。使用右方括号]代表了能被ASCII Art記錄的最大的微笑,而右括号)表示建立了一個半心半意的笑臉,是以這是不可取的。

這份風格指南是最時尚的raywenderlich.com團隊成員們努力協作的成果:

Soheil Moayedi Azarpour

Scott Berrevoets

Eric Cerney

Sam Davies

Evan Dekhayser

Jean-Pierre Distler

Colin Eberhardt

Greg Heo

Matthijs Hollemans

Erik Kerber

Christopher LaPollo

Andy Pereira

Ryan Nystrom

Cesare Rocchi

Ellen Shapiro

Marin Todorov

Chris Wagner

Ray Wenderlich

Jack Wu

我們的靈感來自于蘋果的Swift參考材料:

<a target="_blank" href="https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/index.html">The Swift Programming Language</a>

<a target="_blank" href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html">Using Swift with Cocoa and Objective-C</a>

<a target="_blank" href="https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/index.html">Swift Standard Library Reference</a>

繼續閱讀