2
2
3
3
为现有类型添加功能。
4
4
5
- ** 扩展(Extensions)** 用于为现有的类、结构体、枚举或协议类型添加新功能。
6
- 这包括了扩展那些您无法访问原始源代码的类型的能力(即* 追溯建模* )。
7
- 扩展和 Objective-C 的分类很相似。
8
- (与 Objective-C 分类不同的是,Swift 扩展是没有名字的。)
5
+ ** 扩展(Extensions)** 用于为现有的类、结构体、枚举或协议类型添加新功能。这包括了扩展那些您无法访问原始源代码的类型的能力(即* 追溯建模* )。扩展和 Objective-C 的分类很相似。(与 Objective-C 分类不同的是,Swift 扩展是没有名字的。)
9
6
10
7
Swift 中的扩展可以:
11
8
@@ -16,8 +13,7 @@ Swift 中的扩展可以:
16
13
- 定义和使用新的嵌套类型
17
14
- 使已经存在的类型遵循一个协议
18
15
19
- 在 Swift 中,你甚至可以扩展协议以提供其需要的实现,或者添加额外功能给遵循的类型所使用。
20
- 你可以从 < doc:Protocols#Protocol-Extensions > 获取更多细节。
16
+ 在 Swift 中,你甚至可以扩展协议以提供其需要的实现,或者添加额外功能给遵循的类型所使用。你可以从 < doc:Protocols#Protocol-Extensions > 获取更多细节。
21
17
22
18
> 注意:
23
19
> 扩展可以给一个类型添加新的功能,但是不能重写已经存在的功能。
@@ -91,8 +87,7 @@ extension SomeType {
91
87
```
92
88
-->
93
89
94
- 扩展可以扩充一个现有的类型,给它添加一个或多个协议。
95
- 在添加协议的遵循声明时,协议名称的写法和类或者结构体一样:
90
+ 扩展可以扩充一个现有的类型,给它添加一个或多个协议。在添加协议的遵循声明时,协议名称的写法和类或者结构体一样:
96
91
97
92
``` swift
98
93
extension SomeType : SomeProtocol , AnotherProtocol {
@@ -114,19 +109,13 @@ extension SomeType: SomeProtocol, AnotherProtocol {
114
109
115
110
这种遵循协议的方式在 < doc:Protocols#Adding-Protocol-Conformance-with-an-Extension > 中有描述。
116
111
117
- 扩展可以使用在现有泛型类型上,就像 < doc:Generics#Extending-a-Generic-Type > 中描述的一样。
118
- 你还可以使用扩展给泛型类型有条件地添加功能,
119
- 就像 < doc:Generics#Extensions-with-a-Generic-Where-Clause > 中描述的一样。
112
+ 扩展可以使用在现有泛型类型上,就像 < doc:Generics#Extending-a-Generic-Type > 中描述的一样。你还可以使用扩展给泛型类型有条件地添加功能,就像 < doc:Generics#Extensions-with-a-Generic-Where-Clause > 中描述的一样。
120
113
121
- > 注意:
122
- > 对一个现有的类型,如果你定义了一个扩展来添加新的功能,
123
- > 那么这个类型的所有实例都可以使用这个新功能,包括那些在扩展定义之前就存在的实例。
114
+ > 注意: 对一个现有的类型,如果你定义了一个扩展来添加新的功能,那么这个类型的所有实例都可以使用这个新功能,包括那些在扩展定义之前就存在的实例。
124
115
125
116
## 计算属性
126
117
127
- 扩展可以给现有类型添加计算实例属性和计算类属性。
128
- 这个例子给 Swift 内建的 ` Double ` 类型添加了五个计算型实例属性,
129
- 以提供基本的距离单位处理功能:
118
+ 扩展可以给现有类型添加计算实例属性和计算类属性。这个例子给 Swift 内建的 ` Double ` 类型添加了五个计算型实例属性,以提供基本的距离单位处理功能:
130
119
131
120
``` swift
132
121
extension Double {
@@ -164,22 +153,13 @@ print("Three feet is \(threeFeet) meters")
164
153
```
165
154
-->
166
155
167
- 这些计算属性表示一个 ` Double ` 值应该被视为某种长度单位。
168
- 尽管它们是作为计算属性实现的,
169
- 但是这些属性的名称可以使用点语法附加到浮点字面量值之后,
170
- 作为一种使用该字面量值执行距离转换的方式。
156
+ 这些计算属性表示一个 ` Double ` 值应该被视为某种长度单位。尽管它们是作为计算属性实现的,但是这些属性的名称可以使用点语法附加到浮点字面量值之后,作为一种使用该字面量值执行距离转换的方式。
171
157
172
- 在这个例子中,` Double ` 类型的 ` 1.0 ` 代表的是“一米”。
173
- 这就是为什么计算属性 ` m ` 返回的是 ` self ` ——
174
- 表达式 ` 1.m ` 被认为是计算一个 ` Double ` 类型的 ` 1.0 ` 。
158
+ 在这个例子中,` Double ` 类型的 ` 1.0 ` 代表的是“一米”。这就是为什么计算属性 ` m ` 返回的是 ` self ` ——表达式 ` 1.m ` 被认为是计算一个 ` Double ` 类型的 ` 1.0 ` 。
175
159
176
- 其他单位需要进行一些转换,才能表示为以米为单位的值。
177
- 一千米等于 1000 米,所以计算属性 ` km ` 将该值乘以 ` 1_000.00 `
178
- 来将其转换为以米为单位的数字。类似地,一米等于 3.28084 英尺,
179
- 因此计算属性 ` ft ` 将底层的 ` Double ` 值除以 ` 3.28084 ` 来将其从英尺转换为米。
160
+ 其他单位需要进行一些转换,才能表示为以米为单位的值。一千米等于 1000 米,所以计算属性 ` km ` 将该值乘以 ` 1_000.00 ` 来将其转换为以米为单位的数字。类似地,一米等于 3.28084 英尺,因此计算属性 ` ft ` 将底层的 ` Double ` 值除以 ` 3.28084 ` 来将其从英尺转换为米。
180
161
181
- 这些属性是只读的计算属性,因此为了简便,它们的表达方式省略了 ` get ` 关键字。
182
- 它们的返回值是 ` Double ` 类型,可以在任何接受 ` Double ` 的数学计算中使用:
162
+ 这些属性是只读的计算属性,因此为了简便,它们的表达方式省略了 ` get ` 关键字。它们的返回值是 ` Double ` 类型,可以在任何接受 ` Double ` 的数学计算中使用:
183
163
184
164
``` swift
185
165
let aMarathon = 42 .km + 195 .m
@@ -217,24 +197,15 @@ print("A marathon is \(aMarathon) meters long")
217
197
218
198
## 构造器
219
199
220
- 扩展可以为现有类型添加新的构造器。
221
- 这使你可以扩展其他类型以接受你自己的自定义类型作为构造器参数,
222
- 或提供类型的原始实现中未包含的其他构造选项。
200
+ 扩展可以为现有类型添加新的构造器。这使你可以扩展其他类型以接受你自己的自定义类型作为构造器参数,或提供类型的原始实现中未包含的其他构造选项。
223
201
224
- 扩展可以为一个类添加新的便利构造器(convenience initializer),
225
- 但是它们不能为一个类添加新的指定构造器(designated initializer)或析构器(deinitializer)。
226
- 指定构造器和析构器必须始终由类的原始实现提供。
202
+ 扩展可以为一个类添加新的便利构造器(convenience initializer),但是它们不能为一个类添加新的指定构造器(designated initializer)或析构器(deinitializer)。指定构造器和析构器必须始终由类的原始实现提供。
227
203
228
- 如果你使用扩展为一个值类型添加构造器,并且该值类型提供了所有存储属性的默认值,
229
- 且没有定义任何自定义构造器,你就可以在扩展的构造器中调用该值类型的默认构造器和成员构造器。
230
- 如果你已经将构造器写在该值类型的原始实现中,则不适用于这种情况,
231
- 正如 < doc:Initialization#Initializer-Delegation-for-Value-Types > 中所描述的那样。
204
+ 如果你使用扩展为一个值类型添加构造器,并且该值类型提供了所有存储属性的默认值,且没有定义任何自定义构造器,你就可以在扩展的构造器中调用该值类型的默认构造器和成员构造器。如果你已经将构造器写在该值类型的原始实现中,则不适用于这种情况,正如 < doc:Initialization#Initializer-Delegation-for-Value-Types > 中所描述的那样。
232
205
233
- 如果你使用扩展为另一个模块中声明的结构体添加构造器,
234
- 那么在调用定义模块中的构造器之前,新的构造器是不能访问 ` self ` 的。
206
+ 如果你使用扩展为另一个模块中声明的结构体添加构造器,那么在调用定义模块中的构造器之前,新的构造器是不能访问 ` self ` 的。
235
207
236
- 以下示例定义了一个自定义的 ` Rect ` 结构体来表示几何矩形。
237
- 该示例还定义了两个辅助结构体 ` Size ` 和 ` Point ` ,它们都为所有属性提供了默认值 ` 0.0 ` :
208
+ 以下示例定义了一个自定义的 ` Rect ` 结构体来表示几何矩形。该示例还定义了两个辅助结构体 ` Size ` 和 ` Point ` ,它们都为所有属性提供了默认值 ` 0.0 ` :
238
209
239
210
``` swift
240
211
struct Size {
@@ -266,9 +237,7 @@ struct Rect {
266
237
```
267
238
-->
268
239
269
- 因为 ` Rect ` 结构体为所有属性都提供了默认值,它会自动获得默认构造器和成员构造器,
270
- 如 < doc:Initialization#Default-Initializers > 中所述。
271
- 这些构造器可用于创建新的 ` Rect ` 实例:
240
+ 因为 ` Rect ` 结构体为所有属性都提供了默认值,它会自动获得默认构造器和成员构造器,如 < doc:Initialization#Default-Initializers > 中所述。这些构造器可用于创建新的 ` Rect ` 实例:
272
241
273
242
``` swift
274
243
let defaultRect = Rect ()
@@ -312,9 +281,7 @@ extension Rect {
312
281
```
313
282
-->
314
283
315
- 这个新的构造器首先根据提供的 ` center ` 和 ` size ` 计算一个适当的原点。
316
- 然后这个构造器调用结构体自带的成员构造器 ` init(origin:size:) ` ,
317
- 它会将新的 origin 和 size 值储存在相应的属性中:
284
+ 这个新的构造器首先根据提供的 ` center ` 和 ` size ` 计算一个适当的原点。然后这个构造器调用结构体自带的成员构造器 ` init(origin:size:) ` ,它会将新的 origin 和 size 值储存在相应的属性中:
318
285
319
286
``` swift
320
287
let centerRect = Rect (center : Point (x : 4.0 , y : 4.0 ),
@@ -333,13 +300,11 @@ let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
333
300
```
334
301
-->
335
302
336
- > 注意: 如果你使用扩展提供了一个新的构造器,
337
- > 你仍然需要确保在构造器完成时每个实例都被完全初始化。
303
+ > 注意: 如果你使用扩展提供了一个新的构造器,你仍然需要确保在构造器完成时每个实例都被完全初始化。
338
304
339
305
## 方法
340
306
341
- 扩展可以为现有类型添加新的实例方法和类方法。
342
- 以下示例为 ` Int ` 类型添加了一个名为 ` repetitions ` 的新实例方法:
307
+ 扩展可以为现有类型添加新的实例方法和类方法。以下示例为 ` Int ` 类型添加了一个名为 ` repetitions ` 的新实例方法:
343
308
344
309
``` swift
345
310
extension Int {
@@ -365,8 +330,7 @@ extension Int {
365
330
```
366
331
-->
367
332
368
- ` repetitions(task:) ` 方法仅接受一个类型为 ` () -> Void ` 的参数,
369
- 它表示一个没有参数没有返回值的函数。
333
+ ` repetitions(task:) ` 方法仅接受一个类型为 ` () -> Void ` 的参数,它表示一个没有参数没有返回值的函数。
370
334
371
335
定义了这个扩展之后,你可以对任意整形数值调用 ` repetitions(task:) ` 方法,以执行指定次数的任务:
372
336
@@ -394,9 +358,7 @@ extension Int {
394
358
395
359
### 变值实例方法
396
360
397
- 通过扩展添加的实例方法同样也可以修改(modify)(或 * 改变(mutating)* )实例本身。
398
- 修改 ` self ` 或其属性的结构体和枚举方法,必须将实例方法标记为 ` mutating ` ,
399
- 就像原始实现中的变值方法(mutating methods)一样。
361
+ 通过扩展添加的实例方法同样也可以修改(modify)(或 * 改变(mutating)* )实例本身。修改 ` self ` 或其属性的结构体和枚举方法,必须将实例方法标记为 ` mutating ` ,就像原始实现中的变值方法(mutating methods)一样。
400
362
401
363
下面的示例为 Swift 的 ` Int ` 类型添加了一个新的变值方法 ` square ` ,它可以计算原始值的平方:
402
364
@@ -429,9 +391,7 @@ someInt.square()
429
391
430
392
## 下标
431
393
432
- 扩展可以为现有类型添加新的下标。
433
- 这个示例为 Swift 内置的 ` Int ` 类型添加了一个整数下标。
434
- 下标 ` [n] ` 返回数字从右边数第 ` n ` 位的十进制数字:
394
+ 扩展可以为现有类型添加新的下标。这个示例为 Swift 内置的 ` Int ` 类型添加了一个整数下标。下标 ` [n] ` 返回数字从右边数第 ` n ` 位的十进制数字:
435
395
436
396
- ` 123456789[0] ` 返回 ` 9 `
437
397
- ` 123456789[1] ` 返回 ` 8 `
@@ -501,8 +461,7 @@ extension Int {
501
461
Darwin's pow() function is only for floating point.
502
462
-->
503
463
504
- 如果 ` Int ` 值的数字位数不足以满足所请求的索引,
505
- 那么下标实现会返回 ` 0 ` ,就好像在数字左边补上了 0:
464
+ 如果 ` Int ` 值的数字位数不足以满足所请求的索引,那么下标实现会返回 ` 0 ` ,就好像在数字左边补上了 0:
506
465
507
466
``` swift
508
467
746381295 [9 ]
@@ -576,12 +535,9 @@ extension Int {
576
535
```
577
536
-->
578
537
579
- 这个例子给 ` Int ` 添加了一个新的嵌套枚举。
580
- 这个枚举叫做 ` Kind ` ,表示特定整数所代表的数字类型。
581
- 具体来说,它表示数字是负数、零还是正数。
538
+ 这个例子给 ` Int ` 添加了一个新的嵌套枚举。这个枚举叫做 ` Kind ` ,表示特定整数所代表的数字类型。具体来说,它表示数字是负数、零还是正数。
582
539
583
- 这个例子也给 ` Int ` 添加了一个新的计算实例属性,叫做 ` kind ` ,
584
- 它返回被操作整数所对应的 ` Kind ` 枚举值。
540
+ 这个例子也给 ` Int ` 添加了一个新的计算实例属性,叫做 ` kind ` ,它返回被操作整数所对应的 ` Kind ` 枚举值。
585
541
586
542
现在,这个嵌套枚举可以用于任何 ` Int ` 值:
587
543
@@ -630,12 +586,9 @@ printIntegerKinds([3, 19, -27, 0, -6, 0, 7])
630
586
Workaround for rdar://26016325
631
587
-->
632
588
633
- 这个函数 ` printIntegerKinds(_:) ` 接受一个 ` Int ` 值的数组作为输入,并逐个遍历这些值。
634
- 对于数组中的每个整数,该函数都会检查它的 ` kind ` 计算属性,然后打印适当的描述。
589
+ 这个函数 ` printIntegerKinds(_:) ` 接受一个 ` Int ` 值的数组作为输入,并逐个遍历这些值。对于数组中的每个整数,该函数都会检查它的 ` kind ` 计算属性,然后打印适当的描述。
635
590
636
- > 注意: ` number.kind ` 已经被认为是 ` Int.Kind ` 类型。
637
- > 所以,在 ` switch ` 语句中所有的 ` Int.Kind ` 枚举值可以被缩写,
638
- > 例如使用 ` .negative ` 替代 ` Int.Kind.negative ` 。
591
+ > 注意: ` number.kind ` 已经被认为是 ` Int.Kind ` 类型。所以,在 ` switch ` 语句中所有的 ` Int.Kind ` 枚举值可以被缩写,例如使用 ` .negative ` 替代 ` Int.Kind.negative ` 。
639
592
640
593
> 测试版软件:
641
594
>
0 commit comments