2
2
3
3
除了《基础操作符》里讲到的操作符,Swift还提供了一些高级操作符,用以完成更复杂的数值运算。比如位运算和移位操作符,其语法同C和Objective-C类似。
4
4
5
+ > From 周源:
6
+ 移位: 我读的时候, 感觉位移更顺口一点
7
+
5
8
和C语言的算术操作符不同,Swift默认不支持溢出运算。数值溢出会被捕获并报错。但是,Swift提供了另一套支持溢出运算的操作符,比如可溢出加操作符(&+),可溢出操作符都以&作为前缀。
6
9
10
+ > From 周源:
11
+ &+ -> (&+)
12
+ So
13
+ & -> (&)?
14
+
7
15
在自定义结构体、类或者枚举类型中,可以重载Swift操作符。通过操作符重载,可以简单地实现操作符的重定义。
8
16
17
+ > From 周源:
18
+ 我理解的 "简单的实现" 有二义性, 可表示 实现简单 和 简单实现,
19
+ 这里作者的意思应该是实现简单, 我觉得 方便的实现 也可以表达作者的意思, 你怎么看?
20
+
9
21
Swift允许用户自定义操作符,并且可定制这些操作符的优先级和结合性。
10
22
23
+ > From 周源:
24
+ 这一段原文较长, 省略了部分翻译, 按照会长的意思......
25
+
11
26
12
27
## 位操作符
13
28
@@ -87,6 +102,8 @@ let outputBits = firstBits ^ otherBits // 等于 00010001
87
102
88
103
#### 无符号移位操作
89
104
105
+ > From 周源:
106
+ 移位 -> 位移?
90
107
无符号移位的规则如下:
91
108
92
109
1. 已有的位向左或向右移动指定的位数。
@@ -149,12 +166,19 @@ let blueComponent = pink & 0x0000FF // blueComponent是0x99, 即153
149
166
150
167
负数的编码方式称为二进制补码表示。这种表示方式看起来很奇怪,但它有几个优点。
151
168
169
+ > From 周源:
170
+ The encoding for negative numbers is known as a two’s complement representation.
171
+ 负数的编码方式称为二进制补码表示 -> 负数的编码方式用二进制补码表示?
172
+
152
173
首先,对全部8个比特位(包括符号位)做标准的二进制加法就可以完成-1 加 -4 的操作,加法过程中丢弃超出的比特位。
153
174
154
175
![ 有符号移位操作] ( https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/bitshiftSignedAddition_2x.png )
155
176
156
177
第二,使用二进制补码表示方式,我们可以和正数一样对负数进行按位左移或右移,同样也是左移1位时乘于2,右移1位时除于2。但是,对有符号整型的右移有一个特别的要求:
157
178
179
+ > From 周源:
180
+ 使用二进制补码表示方式 -> 使用二进制补码?
181
+
158
182
+ 有符号和无符号整型按位右移时规则相同,但有符号整型移位后出现的空位使用符号位来填充,而不是0。
159
183
160
184
![ 有符号移位操作] ( https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/bitshiftSigned_2x.png )
@@ -294,7 +318,7 @@ let y = x &/ 0
294
318
295
319
Swift操作符的优先级和结合性的完整规则,请看表达式。
296
320
297
- > < b > 注意:</ b >
321
+ > 注意:
298
322
>
299
323
> Swift操作符的优先级和结合性的规则跟C系语言不太一样,相对于C语言和Objective-C更加简单且保守。所以在移植已有代码到Swift时,注意确认操作数的计算顺序。
300
324
@@ -370,6 +394,9 @@ let alsoPositive = -negative
370
394
371
395
加法运算之前定义过了,这里无需重新定义。加赋操作符函数使用已有的加法运算将左值加上右值:
372
396
397
+ > From 周源
398
+ > 加赋操作符函数使用已有的加法运算将左值加上右值: -> 加法操作符... ?
399
+
373
400
```
374
401
var original = Vector2D(x: 1.0, y: 2.0)
375
402
let vectorToAdd = Vector2D(x: 3.0, y: 4.0)
@@ -388,14 +415,17 @@ original += vectorToAdd
388
415
389
416
这个自加操作符函数使用了前面定义过的加赋运算,将自己加上一个值为 (1.0,1.0) 的对象然后将返回值赋给自己。
390
417
418
+ > From 周源
419
+ > 加赋运算 -> 加法运算... ?
420
+
391
421
```
392
422
var toIncrement = Vector2D(x: 3.0, y: 4.0)
393
423
let afterIncrement = ++toIncrement
394
424
// toIncrement 等于(4.0, 5.0)
395
425
// afterIncrement 也等于 (4.0, 5.0)
396
426
```
397
427
398
- > < b > 注意:</ b >
428
+ > 注意:
399
429
>
400
430
> 默认的赋值符(=)是不可重载的。只有复合赋值符可以重载。条件操作符 a?b:c 也是不可重载的。
401
431
@@ -431,6 +461,9 @@ println("这两个向量相等")
431
461
432
462
除了标准的操作符,你还可以声明一些个性的操作符,但自定义操作符只能使用这些字符` / = - + * % < >!& | ^ . ~ `
433
463
464
+ > From 周源:
465
+ > 个性的操作符 -> 自定义的操作符 ?
466
+
434
467
新的操作符需要在全局域使用` operator ` 关键字声明,可以声明为前置,中置或后置的。
435
468
436
469
```
@@ -439,6 +472,10 @@ operator prefix +++ {}
439
472
440
473
这段代码定义了一个新的前置操作符+++,此前Swift并不存在这个操作符,此处针对` Vector2D ` 对象的这个操作符具有个性化的含义。+++被定义为双自增操作符,它使用之前定义的加赋运算将自已加上自己然后返回。
441
474
475
+ > From 周源:
476
+ > 个性化的含义 ?
477
+
478
+
442
479
```
443
480
@prefix @assignment func +++ (inout vector: Vector2D) -> Vector2D {
444
481
vector += vector
@@ -476,6 +513,9 @@ let plusMinusVector = firstVector +- secondVector
476
513
// plusMinusVector 是 Vector2D实例,等于 (4.0, -2.0)
477
514
```
478
515
516
+ > From 周源:
517
+ > plusMinusVector 是 Vector2D实例 -> plusMinusVector 是 Vector2D的实例 ?
518
+
479
519
这个操作符把两个向量的x相加, y相减。因为它实际上属于加减运算,所以让它保持了和加减法一样的结合性和优先级(左结合,优先级为140)。查阅完整的Swift默认优先级和结合性的设置,请移步[ 表达式] ( https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-XID_655 ) .
480
520
481
521
0 commit comments