這個風格指南可能和你從其他地方看到的不同,我們的焦點主要集中在網際網路和文章上的可讀性,建立這個程式設計風格指南是為了保持我們的書籍、教程和入門工具包中代碼的優雅與一緻性------盡管我們有和許多不同的作者合作。
我們的首要目的是簡潔、可讀性和簡單。
對類、方法、變量等使用包含描述性的駝峰式(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>