11# raywenderlich.com Swift风格指南
22
3- 因为该指南关注于网页上以及打印版的可读性,所以它与它你可能阅读过的指南有所不同。为了保证那些在我们的书中、教程里以及配套工程里的代码看上去美观且一致 ,我们写下了这份风格指南,尽管书由许多不同作者共同创作而成。
3+ 因为该指南关注于网页上以及打印版的可读性,所以它可能与你阅读过的指南有所不同。为了保证那些在我们书中、教程里以及初学者工程里的代码美观并且一致 ,我们写下了这份风格指南,尽管书由许多不同作者共同创作而成。
44
55该指南的首要目标是让代码紧凑,可读性高且简洁。
66
1919* [ 闭包] ( #闭包 )
2020* [ 类型] ( #类型 )
2121 * [ 常量] ( #常量 )
22- * [ Optionals] ( #Optionals )
23- * [ 类型推断] ( #类型推断 )
22+ * [ Optional] ( #Optional )
23+ * [ 类型推导] ( #类型推导 )
24+ * [ 语法糖] ( #语法糖 )
2425* [ 控制流] ( #控制流 )
25- * [ Self ] ( #Self )
26+ * [ Self的使用 ] ( #Self的使用 )
2627* [ 笑脸] ( #笑脸 )
27- * [ 工作人员 ] ( #工作人员 )
28+ * [ 致谢 ] ( #致谢 )
2829
2930## 语言
3031
31- 使用美式英语拼写以匹配苹果公司的API
32+ 使用美式英语拼写以确保和苹果公司的API一致
3233
3334** 优选:**
3435``` swift
@@ -42,8 +43,8 @@ var colour = "red"
4243
4344## 间隔
4445
45- * 使用2个空格进行缩进而不是使用Tab,这样可以节省空格,阻止换行。确保在Xcode的配置项中进行了设置 。
46- * 方法的花括号以及其它花括号(` if ` /` else ` /` switch ` /` while ` 等等)总是跟语句在同一行开始,但是在新的一行中结束 。
46+ * 使用2个空格而不是Tab进行缩进,可以减少换行。确保在Xcode的配置项中使用此设置 。
47+ * 方法的花括号以及其它花括号(` if ` /` else ` /` switch ` /` while ` 等等)总是跟语句在同一行开始,新起一行结束 。
4748
4849** 优选:**
4950
@@ -67,17 +68,17 @@ else {
6768}
6869```
6970
70- * 方法之间应该总是用一空白行进行分隔以提高视觉以及结构上的清晰度。方法中的空白符用来隔离功能块,但是如果一个方法中存在太多这种功能块时,通常也意味着你需要将它重构为多个方法了 。
71+ * 方法之间应该总是用一个空行进行分隔以提高视觉以及结构上的清晰度。方法中的空白用来分开功能块,但是如果一个方法中存在太多功能块时,通常意味着你需要将它重构为多个方法 。
7172
7273## 注释
7374
7475* 在需要的时候使用注释说明一块代码** 为什么** 这么做。注释必须时刻跟进代码,不然删了得了。
7576
76- * 因为代码应该尽可能的自文档化,所以避免在代码中使用成块的注释 。** 例外:该规则不适用与用于生成文档的成块注释 。**
77+ * 代码应该尽可能的自文档化,避免在代码中使用成块的注释 。** 例外:该规则不适用与用于生成文档的块注释 。**
7778
7879## 命名
7980
80- 使用驼峰法为类、方法、变量等等取一个描述性强的名字。模块范围的类名以及常量名称要以大写字母开头,而方法名跟变量名则应该以小写字母开头 。
81+ 使用驼峰法为类、方法、变量等取一个描述性强的名字。模块范围的类名和常量名以大写字母开头,而方法名和变量名应以小写字母开头 。
8182
8283** 优选:**
8384
@@ -101,7 +102,7 @@ class app_widgetContainer {
101102}
102103```
103104
104- 对于普通函数以及构造函数名称 ,除非上下文含义非常清楚,对所有的参数都加以命名是更为推荐的做法。如果外部参数名称可以使得函数调用更具有可读性,那么请带上它 。
105+ 对于函数以及初始化方法 ,除非上下文含义非常清楚,推荐对所有的参数都加以命名。如果外部参数名称可以使得函数调用更易读,请加上它 。
105106
106107``` swift
107108func dateFromString (dateString : NSString) -> NSDate
@@ -114,7 +115,7 @@ convertPointAt(column: 42, row: 13)
114115timedAction (delay : 1.0 , perform : someOtherAction)
115116```
116117
117- 对于方法,遵循苹果公司的命名标准 ,在方法名中提及第一个参数:
118+ 对于方法,遵循苹果公司的命名规范 ,在方法名中提及第一个参数:
118119
119120``` swift
120121class Guideline {
@@ -129,23 +130,23 @@ class Guideline {
129130dateFromString()函数真是太棒了。
130131在你的init()方法中调用convertPointAt(column:, row:)。
131132timedAction(delay:, perform:)的返回值可能为nil。
132- Guideline对象只有两个方法:combineWithString(options:)跟upvoteBy ()。
133+ Guideline对象只有两个方法:combineWithString(options:)和upvoteBy ()。
133134你不应该直接调用数据源方法tableView(cellForRowAtIndexPath:)。
134135```
135136
136137### 类前缀
137138
138- Swift中的类型会自动加入包含它们的模块的命名空间。所以即使是为了最小化命名冲突的可能性,前缀也是不必要的。如果来自于不同模块的两个名称冲突了,可以通过在名称前面加上模块名以消除歧义 :
139+ Swift中的类型会被自动加入包含它们的模块的命名空间。所以减少命名冲突的前缀已经不必要了。如果同模块的两个名称冲突了,可以在名称前加上模块名消除歧义 :
139140
140141``` swift
141142import MyModule
142143
143144var myClass = MyModule.MyClass ()
144145```
145146
146- ** 不应该** 在自己创建的类型上加前缀 。
147+ ** 不应该** 给自己创建的Swift类型加前缀 。
147148
148- 如果需要将Swift类型暴露在Objective-C环境中使用,请按照以下方式提供合适的前缀 (前缀的命名请参考[ Objective-C风格指南] [ objc-style-guide ] ):
149+ 如果需要把Swift类型暴露给Objective-C使用,你可以添加一个合适的前缀 (前缀的命名请参考[ Objective-C风格指南] [ objc-style-guide ] ):
149150
150151``` swift
151152@objc (RWTChicken) class Chicken {
@@ -155,11 +156,11 @@ var myClass = MyModule.MyClass()
155156
156157## 分号
157158
158- Swift中,每条语句后的分号都不是必需的。只有在一行中有多条语句时才需要添加上分号 。
159+ Swift不要求每条语句后加分号。只有在你想把多条语句写到一行时才需要加上分号 。
159160
160161请不要在一行中写上用分号隔开的多条语句。
161162
162- 这条规则的唯一例外就是` for-conditional-increment ` 结构,该结构中分号是必需的。不过,请尽可能地使用另外一种结构, ` for-in ` 循环 。
163+ 这条规则的唯一例外就是` for-conditional-increment ` 结构,该结构中分号是必需的。不过请尽量用 ` for-in ` 结构代替它们 。
163164
164165** 优选:**
165166``` swift
@@ -175,7 +176,7 @@ var swift = "not a scripting language";
175176
176177## 类与结构体
177178
178- 下面的代码是一个很有标准范儿的类定义 ,请参考:
179+ 下面是一个风格良好的类定义代码例子 ,请参考:
179180
180181``` swift
181182class Circle : Shape {
@@ -209,17 +210,17 @@ class Circle: Shape {
209210 }
210211}
211212```
212- 上面的例子阐述了这么几个风格上的准则 :
213+ 上面的例子阐述了如下的风格准则 :
213214
214- + 当为属性 、变量、常量、参数声明以及其它语句等定义类型时,而冒号的后面加上空格而不是前面 ,比如:` x: Int ` 跟` Circle: Shape ` 。
215- + 要对getter跟setter定义以及属性观察器进行缩进 。
215+ + 给属性 、变量、常量、参数及其它语句指定类型时,在冒号的后面加上空格而不是前面 ,比如:` x: Int ` 跟` Circle: Shape ` 。
216+ + 对getter跟setter定义以及属性观察器进行缩进 。
216217+ 如果多个变量、结构有着同样的目的或者上下文,在同一行上进行定义。
217218
218- ## Self
219+ ## Self的使用
219220
220- 考虑到在Swift中访问一个对象的属性或者调用它的方法并不需要使用 ` self ` ,所以请避免使用它 。
221+ 在Swift中访问对象属性或调用方法时不需要使用 ` self ` ,请避免使用它 。
221222
222- 需要使用 ` self ` 的唯一理由就是在初始化一个类或者结构体时,使用其在属性名和参数之间加以区分 :
223+ 使用 ` self ` 的唯一理由是在初始化一个类或结构体时区分属性名和参数名 :
223224
224225``` swift
225226class BoardLocation {
@@ -234,26 +235,26 @@ class BoardLocation {
234235
235236## 函数声明
236237
237- 保持函数声明短小精悍,尽量在一行中完成声明,同时还包含了开括号 :
238+ 保持函数声明短小精悍,保持在一行内,花括号在同一行内开始 :
238239
239240``` swift
240- func reticulateSplines (spline : Double [ ]) -> Bool {
241+ func reticulateSplines (spline : [ Double ]) -> Bool {
241242 // reticulate code goes here
242243}
243244```
244245
245- 对于有着长长的参数的函数 ,请在适当的位置进行断行且对后续行缩进一级:
246+ 对于有着长签名的函数 ,请在适当的位置进行断行且对后续行缩进一级:
246247
247248``` swift
248- func reticulateSplines (spline : Double [ ], adjustmentFactor : Double ,
249+ func reticulateSplines (spline : [ Double ], adjustmentFactor : Double ,
249250 translateConstant : Int , comment : String ) -> Bool {
250251 // reticulate code goes here
251252}
252253```
253254
254255## 闭包
255256
256- 尽可能地使用尾闭包语法。在所有的情况下都需要给闭包参数一个描述性强的名称 :
257+ 尽可能地使用尾闭包语法。在所有的情况下给闭包参数一个描述性强的名称 :
257258
258259``` swift
259260return SKAction.customActionWithDuration (effect.duration ) { node, elapsedTime in
@@ -271,7 +272,7 @@ attendeeList.sort { a, b in
271272
272273## 类型
273274
274- 尽可能地使用Swift原生类型 。Swift提供了对Objective-C的桥接所以在需要的时候仍然可以使用全部的Objective -C方法:
275+ 如果可能,使用Swift的原生类型 。Swift提供了对Objective-C的桥接,如果需要,仍然可以使用全部的Objective -C方法:
275276
276277** 优选:**
277278``` swift
@@ -285,15 +286,15 @@ let width: NSNumber = 120.0 //NSNumber
285286let widthString: NSString = width.stringValue // NSString
286287```
287288
288- 在Sprite Kit的代码中,如果` CGFloat ` 可以避免过多的转换而使得代码简洁明了,那么请用上它 。
289+ 在Sprite Kit的代码中,如果` CGFloat ` 可以避免过多的转换从而使得代码简洁,那么请使用它 。
289290
290291### 常量
291292
292293常量通过` let ` 关键字定义,而变量使用` var ` 关键字定义。任何值如果** 是** 一个不变量,那么请使用` let ` 关键字恰如其分地定义它。最后你会发现自己喜欢使用` let ` 远多于` far ` 。
293294
294- ** Tip:** 有一个方法可以帮你符合该项规则 ,将所有值都定义成常量,然后编译器提示的时候将其改为变量。
295+ ** Tip:** 有一个方法可以帮你满足该项规则 ,将所有值都定义成常量,然后编译器提示的时候将其改为变量。
295296
296- ### Optionals
297+ ### Optional
297298
298299在nil值可能出现的情况下,将变量跟函数返回值的类型通过` ? ` 定义成Optional。
299300
@@ -313,9 +314,9 @@ if let view = self.optionalView {
313314}
314315```
315316
316- ### 类型推断
317+ ### 类型推导
317318
318- Swift的编译器可以推断出变量跟常量的类型。可以通过类型别名(在冒号后面指出其类型)提供显式类型 ,不过大多数情况下这都是不必要的。
319+ Swift的编译器可以推导出变量和常量的类型。可以显式地提供类型别名(冒号后面声明的类型) ,不过大多数情况下这都是不必要的。
319320
320321保持代码紧凑,然后让编译器推断变量跟常量的类型。
321322
@@ -331,16 +332,36 @@ let message: String = "Click the button"
331332var currentBounds: CGRect = computeViewBounds ()
332333```
333334
334- ** 注意** :遵循这条准则意味着描述性强的名称比之前更为重要了。
335+ ** 注意** :遵循这条准则意味着使用描述性强的名称比之前更为重要了。
336+
337+ ### 语法糖
338+
339+ Prefer the shortcut versions of type declarations over the full generics syntax.
340+
341+ 使用简写的类型声明,而不是它的全泛型版本。
342+
343+ ** 优选:**
344+ ``` swift
345+ var deviceModels: [String ]
346+ var employees: [Int : String ]
347+ var faxNumber: Int ?
348+ ```
349+
350+ ** 不建议使用:**
351+ ``` swift
352+ var deviceModels: Array <String >
353+ var employees: Dictionary <Int , String >
354+ var faxNumber: Optional <Int >
355+ ```
335356
336357## 控制流
337358
338359对于` for ` 循环,优选` for-in ` 风格而不是` for-condition-increment ` 风格:
339360
340361** 优选:**
341362``` swift
342- for _ in 0 .. 5 {
343- println (" Hello five times" )
363+ for _ in 0 ..< 3 {
364+ println (" Hello three times" )
344365}
345366
346367for person in attendeeList {
@@ -350,8 +371,8 @@ for person in attendeeList {
350371
351372** 不建议使用:**
352373``` swift
353- for var i = 0 ; i < 5 ; i++ {
354- println (" Hello five times" )
374+ for var i = 0 ; i < 3 ; i++ {
375+ println (" Hello three times" )
355376}
356377
357378for var i = 0 ; i < attendeeList.count ; i++ {
@@ -374,7 +395,7 @@ for var i = 0; i < attendeeList.count; i++ {
374395:)
375396```
376397
377- ## 工作人员
398+ ## 致谢
378399
379400该风格指南是由下面这些格外有范儿的raywenderlich.com团队成员齐心协力一同打造:
380401
@@ -407,4 +428,4 @@ for var i = 0; i < attendeeList.count; i++ {
407428* [ Swift Standard Library Reference] ( https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/index.html )
408429
409430
410- [ objc-style-guide ] : https://github.com/raywenderlich/objective-c-style-guide
431+ [ objc-style-guide ] : https://github.com/raywenderlich/objective-c-style-guide
0 commit comments