1
1
# raywenderlich.com Swift风格指南
2
2
3
- 因为该指南关注于网页上以及打印版的可读性,所以它与它你可能阅读过的指南有所不同。为了保证那些在我们的书中、教程里以及配套工程里的代码看上去美观且一致 ,我们写下了这份风格指南,尽管书由许多不同作者共同创作而成。
3
+ 因为该指南关注于网页上以及打印版的可读性,所以它可能与你阅读过的指南有所不同。为了保证那些在我们书中、教程里以及初学者工程里的代码美观并且一致 ,我们写下了这份风格指南,尽管书由许多不同作者共同创作而成。
4
4
5
5
该指南的首要目标是让代码紧凑,可读性高且简洁。
6
6
19
19
* [ 闭包] ( #闭包 )
20
20
* [ 类型] ( #类型 )
21
21
* [ 常量] ( #常量 )
22
- * [ Optionals] ( #Optionals )
23
- * [ 类型推断] ( #类型推断 )
22
+ * [ Optional] ( #Optional )
23
+ * [ 类型推导] ( #类型推导 )
24
+ * [ 语法糖] ( #语法糖 )
24
25
* [ 控制流] ( #控制流 )
25
- * [ Self ] ( #Self )
26
+ * [ Self的使用 ] ( #Self的使用 )
26
27
* [ 笑脸] ( #笑脸 )
27
- * [ 工作人员 ] ( #工作人员 )
28
+ * [ 致谢 ] ( #致谢 )
28
29
29
30
## 语言
30
31
31
- 使用美式英语拼写以匹配苹果公司的API
32
+ 使用美式英语拼写以确保和苹果公司的API一致
32
33
33
34
** 优选:**
34
35
``` swift
@@ -42,8 +43,8 @@ var colour = "red"
42
43
43
44
## 间隔
44
45
45
- * 使用2个空格进行缩进而不是使用Tab,这样可以节省空格,阻止换行。确保在Xcode的配置项中进行了设置 。
46
- * 方法的花括号以及其它花括号(` if ` /` else ` /` switch ` /` while ` 等等)总是跟语句在同一行开始,但是在新的一行中结束 。
46
+ * 使用2个空格而不是Tab进行缩进,可以减少换行。确保在Xcode的配置项中使用此设置 。
47
+ * 方法的花括号以及其它花括号(` if ` /` else ` /` switch ` /` while ` 等等)总是跟语句在同一行开始,新起一行结束 。
47
48
48
49
** 优选:**
49
50
@@ -67,17 +68,17 @@ else {
67
68
}
68
69
```
69
70
70
- * 方法之间应该总是用一空白行进行分隔以提高视觉以及结构上的清晰度。方法中的空白符用来隔离功能块,但是如果一个方法中存在太多这种功能块时,通常也意味着你需要将它重构为多个方法了 。
71
+ * 方法之间应该总是用一个空行进行分隔以提高视觉以及结构上的清晰度。方法中的空白用来分开功能块,但是如果一个方法中存在太多功能块时,通常意味着你需要将它重构为多个方法 。
71
72
72
73
## 注释
73
74
74
75
* 在需要的时候使用注释说明一块代码** 为什么** 这么做。注释必须时刻跟进代码,不然删了得了。
75
76
76
- * 因为代码应该尽可能的自文档化,所以避免在代码中使用成块的注释 。** 例外:该规则不适用与用于生成文档的成块注释 。**
77
+ * 代码应该尽可能的自文档化,避免在代码中使用成块的注释 。** 例外:该规则不适用与用于生成文档的块注释 。**
77
78
78
79
## 命名
79
80
80
- 使用驼峰法为类、方法、变量等等取一个描述性强的名字。模块范围的类名以及常量名称要以大写字母开头,而方法名跟变量名则应该以小写字母开头 。
81
+ 使用驼峰法为类、方法、变量等取一个描述性强的名字。模块范围的类名和常量名以大写字母开头,而方法名和变量名应以小写字母开头 。
81
82
82
83
** 优选:**
83
84
@@ -101,7 +102,7 @@ class app_widgetContainer {
101
102
}
102
103
```
103
104
104
- 对于普通函数以及构造函数名称 ,除非上下文含义非常清楚,对所有的参数都加以命名是更为推荐的做法。如果外部参数名称可以使得函数调用更具有可读性,那么请带上它 。
105
+ 对于函数以及初始化方法 ,除非上下文含义非常清楚,推荐对所有的参数都加以命名。如果外部参数名称可以使得函数调用更易读,请加上它 。
105
106
106
107
``` swift
107
108
func dateFromString (dateString : NSString) -> NSDate
@@ -114,7 +115,7 @@ convertPointAt(column: 42, row: 13)
114
115
timedAction (delay : 1.0 , perform : someOtherAction)
115
116
```
116
117
117
- 对于方法,遵循苹果公司的命名标准 ,在方法名中提及第一个参数:
118
+ 对于方法,遵循苹果公司的命名规范 ,在方法名中提及第一个参数:
118
119
119
120
``` swift
120
121
class Guideline {
@@ -129,23 +130,23 @@ class Guideline {
129
130
dateFromString()函数真是太棒了。
130
131
在你的init()方法中调用convertPointAt(column:, row:)。
131
132
timedAction(delay:, perform:)的返回值可能为nil。
132
- Guideline对象只有两个方法:combineWithString(options:)跟upvoteBy ()。
133
+ Guideline对象只有两个方法:combineWithString(options:)和upvoteBy ()。
133
134
你不应该直接调用数据源方法tableView(cellForRowAtIndexPath:)。
134
135
```
135
136
136
137
### 类前缀
137
138
138
- Swift中的类型会自动加入包含它们的模块的命名空间。所以即使是为了最小化命名冲突的可能性,前缀也是不必要的。如果来自于不同模块的两个名称冲突了,可以通过在名称前面加上模块名以消除歧义 :
139
+ Swift中的类型会被自动加入包含它们的模块的命名空间。所以减少命名冲突的前缀已经不必要了。如果同模块的两个名称冲突了,可以在名称前加上模块名消除歧义 :
139
140
140
141
``` swift
141
142
import MyModule
142
143
143
144
var myClass = MyModule.MyClass ()
144
145
```
145
146
146
- ** 不应该** 在自己创建的类型上加前缀 。
147
+ ** 不应该** 给自己创建的Swift类型加前缀 。
147
148
148
- 如果需要将Swift类型暴露在Objective-C环境中使用,请按照以下方式提供合适的前缀 (前缀的命名请参考[ Objective-C风格指南] [ objc-style-guide ] ):
149
+ 如果需要把Swift类型暴露给Objective-C使用,你可以添加一个合适的前缀 (前缀的命名请参考[ Objective-C风格指南] [ objc-style-guide ] ):
149
150
150
151
``` swift
151
152
@objc (RWTChicken) class Chicken {
@@ -155,11 +156,11 @@ var myClass = MyModule.MyClass()
155
156
156
157
## 分号
157
158
158
- Swift中,每条语句后的分号都不是必需的。只有在一行中有多条语句时才需要添加上分号 。
159
+ Swift不要求每条语句后加分号。只有在你想把多条语句写到一行时才需要加上分号 。
159
160
160
161
请不要在一行中写上用分号隔开的多条语句。
161
162
162
- 这条规则的唯一例外就是` for-conditional-increment ` 结构,该结构中分号是必需的。不过,请尽可能地使用另外一种结构, ` for-in ` 循环 。
163
+ 这条规则的唯一例外就是` for-conditional-increment ` 结构,该结构中分号是必需的。不过请尽量用 ` for-in ` 结构代替它们 。
163
164
164
165
** 优选:**
165
166
``` swift
@@ -175,7 +176,7 @@ var swift = "not a scripting language";
175
176
176
177
## 类与结构体
177
178
178
- 下面的代码是一个很有标准范儿的类定义 ,请参考:
179
+ 下面是一个风格良好的类定义代码例子 ,请参考:
179
180
180
181
``` swift
181
182
class Circle : Shape {
@@ -209,17 +210,17 @@ class Circle: Shape {
209
210
}
210
211
}
211
212
```
212
- 上面的例子阐述了这么几个风格上的准则 :
213
+ 上面的例子阐述了如下的风格准则 :
213
214
214
- + 当为属性 、变量、常量、参数声明以及其它语句等定义类型时,而冒号的后面加上空格而不是前面 ,比如:` x: Int ` 跟` Circle: Shape ` 。
215
- + 要对getter跟setter定义以及属性观察器进行缩进 。
215
+ + 给属性 、变量、常量、参数及其它语句指定类型时,在冒号的后面加上空格而不是前面 ,比如:` x: Int ` 跟` Circle: Shape ` 。
216
+ + 对getter跟setter定义以及属性观察器进行缩进 。
216
217
+ 如果多个变量、结构有着同样的目的或者上下文,在同一行上进行定义。
217
218
218
- ## Self
219
+ ## Self的使用
219
220
220
- 考虑到在Swift中访问一个对象的属性或者调用它的方法并不需要使用 ` self ` ,所以请避免使用它 。
221
+ 在Swift中访问对象属性或调用方法时不需要使用 ` self ` ,请避免使用它 。
221
222
222
- 需要使用 ` self ` 的唯一理由就是在初始化一个类或者结构体时,使用其在属性名和参数之间加以区分 :
223
+ 使用 ` self ` 的唯一理由是在初始化一个类或结构体时区分属性名和参数名 :
223
224
224
225
``` swift
225
226
class BoardLocation {
@@ -234,26 +235,26 @@ class BoardLocation {
234
235
235
236
## 函数声明
236
237
237
- 保持函数声明短小精悍,尽量在一行中完成声明,同时还包含了开括号 :
238
+ 保持函数声明短小精悍,保持在一行内,花括号在同一行内开始 :
238
239
239
240
``` swift
240
- func reticulateSplines (spline : Double [ ]) -> Bool {
241
+ func reticulateSplines (spline : [ Double ]) -> Bool {
241
242
// reticulate code goes here
242
243
}
243
244
```
244
245
245
- 对于有着长长的参数的函数 ,请在适当的位置进行断行且对后续行缩进一级:
246
+ 对于有着长签名的函数 ,请在适当的位置进行断行且对后续行缩进一级:
246
247
247
248
``` swift
248
- func reticulateSplines (spline : Double [ ], adjustmentFactor : Double ,
249
+ func reticulateSplines (spline : [ Double ], adjustmentFactor : Double ,
249
250
translateConstant : Int , comment : String ) -> Bool {
250
251
// reticulate code goes here
251
252
}
252
253
```
253
254
254
255
## 闭包
255
256
256
- 尽可能地使用尾闭包语法。在所有的情况下都需要给闭包参数一个描述性强的名称 :
257
+ 尽可能地使用尾闭包语法。在所有的情况下给闭包参数一个描述性强的名称 :
257
258
258
259
``` swift
259
260
return SKAction.customActionWithDuration (effect.duration ) { node, elapsedTime in
@@ -271,7 +272,7 @@ attendeeList.sort { a, b in
271
272
272
273
## 类型
273
274
274
- 尽可能地使用Swift原生类型 。Swift提供了对Objective-C的桥接所以在需要的时候仍然可以使用全部的Objective -C方法:
275
+ 如果可能,使用Swift的原生类型 。Swift提供了对Objective-C的桥接,如果需要,仍然可以使用全部的Objective -C方法:
275
276
276
277
** 优选:**
277
278
``` swift
@@ -285,15 +286,15 @@ let width: NSNumber = 120.0 //NSNumber
285
286
let widthString: NSString = width.stringValue // NSString
286
287
```
287
288
288
- 在Sprite Kit的代码中,如果` CGFloat ` 可以避免过多的转换而使得代码简洁明了,那么请用上它 。
289
+ 在Sprite Kit的代码中,如果` CGFloat ` 可以避免过多的转换从而使得代码简洁,那么请使用它 。
289
290
290
291
### 常量
291
292
292
293
常量通过` let ` 关键字定义,而变量使用` var ` 关键字定义。任何值如果** 是** 一个不变量,那么请使用` let ` 关键字恰如其分地定义它。最后你会发现自己喜欢使用` let ` 远多于` far ` 。
293
294
294
- ** Tip:** 有一个方法可以帮你符合该项规则 ,将所有值都定义成常量,然后编译器提示的时候将其改为变量。
295
+ ** Tip:** 有一个方法可以帮你满足该项规则 ,将所有值都定义成常量,然后编译器提示的时候将其改为变量。
295
296
296
- ### Optionals
297
+ ### Optional
297
298
298
299
在nil值可能出现的情况下,将变量跟函数返回值的类型通过` ? ` 定义成Optional。
299
300
@@ -313,9 +314,9 @@ if let view = self.optionalView {
313
314
}
314
315
```
315
316
316
- ### 类型推断
317
+ ### 类型推导
317
318
318
- Swift的编译器可以推断出变量跟常量的类型。可以通过类型别名(在冒号后面指出其类型)提供显式类型 ,不过大多数情况下这都是不必要的。
319
+ Swift的编译器可以推导出变量和常量的类型。可以显式地提供类型别名(冒号后面声明的类型) ,不过大多数情况下这都是不必要的。
319
320
320
321
保持代码紧凑,然后让编译器推断变量跟常量的类型。
321
322
@@ -331,16 +332,36 @@ let message: String = "Click the button"
331
332
var currentBounds: CGRect = computeViewBounds ()
332
333
```
333
334
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
+ ```
335
356
336
357
## 控制流
337
358
338
359
对于` for ` 循环,优选` for-in ` 风格而不是` for-condition-increment ` 风格:
339
360
340
361
** 优选:**
341
362
``` swift
342
- for _ in 0 .. 5 {
343
- println (" Hello five times" )
363
+ for _ in 0 ..< 3 {
364
+ println (" Hello three times" )
344
365
}
345
366
346
367
for person in attendeeList {
@@ -350,8 +371,8 @@ for person in attendeeList {
350
371
351
372
** 不建议使用:**
352
373
``` 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" )
355
376
}
356
377
357
378
for var i = 0 ; i < attendeeList.count ; i++ {
@@ -374,7 +395,7 @@ for var i = 0; i < attendeeList.count; i++ {
374
395
:)
375
396
```
376
397
377
- ## 工作人员
398
+ ## 致谢
378
399
379
400
该风格指南是由下面这些格外有范儿的raywenderlich.com团队成员齐心协力一同打造:
380
401
@@ -407,4 +428,4 @@ for var i = 0; i < attendeeList.count; i++ {
407
428
* [ Swift Standard Library Reference] ( https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/index.html )
408
429
409
430
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