Skip to content

Commit 9d6ba8c

Browse files
author
远舟
committed
23_Advanced_Operators reviewed
23_Advanced_Operators reviewed
1 parent be71afe commit 9d6ba8c

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

src/chapter2/23_Advanced_Operators.md

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,27 @@
22

33
除了《基础操作符》里讲到的操作符,Swift还提供了一些高级操作符,用以完成更复杂的数值运算。比如位运算和移位操作符,其语法同C和Objective-C类似。
44

5+
> From 周源:
6+
移位: 我读的时候, 感觉位移更顺口一点
7+
58
和C语言的算术操作符不同,Swift默认不支持溢出运算。数值溢出会被捕获并报错。但是,Swift提供了另一套支持溢出运算的操作符,比如可溢出加操作符(&+),可溢出操作符都以&作为前缀。
69

10+
> From 周源:
11+
&+ -> (&+)
12+
So
13+
& -> (&)?
14+
715
在自定义结构体、类或者枚举类型中,可以重载Swift操作符。通过操作符重载,可以简单地实现操作符的重定义。
816

17+
> From 周源:
18+
我理解的 "简单的实现" 有二义性, 可表示 实现简单 和 简单实现,
19+
这里作者的意思应该是实现简单, 我觉得 方便的实现 也可以表达作者的意思, 你怎么看?
20+
921
Swift允许用户自定义操作符,并且可定制这些操作符的优先级和结合性。
1022

23+
> From 周源:
24+
这一段原文较长, 省略了部分翻译, 按照会长的意思......
25+
1126

1227
## 位操作符
1328

@@ -87,6 +102,8 @@ let outputBits = firstBits ^ otherBits // 等于 00010001
87102

88103
#### 无符号移位操作
89104

105+
> From 周源:
106+
移位 -> 位移?
90107
无符号移位的规则如下:
91108

92109
1. 已有的位向左或向右移动指定的位数。
@@ -149,12 +166,19 @@ let blueComponent = pink & 0x0000FF // blueComponent是0x99, 即153
149166

150167
负数的编码方式称为二进制补码表示。这种表示方式看起来很奇怪,但它有几个优点。
151168

169+
> From 周源:
170+
The encoding for negative numbers is known as a two’s complement representation.
171+
负数的编码方式称为二进制补码表示 -> 负数的编码方式用二进制补码表示?
172+
152173
首先,对全部8个比特位(包括符号位)做标准的二进制加法就可以完成-1 加 -4 的操作,加法过程中丢弃超出的比特位。
153174

154175
![有符号移位操作](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/bitshiftSignedAddition_2x.png)
155176

156177
第二,使用二进制补码表示方式,我们可以和正数一样对负数进行按位左移或右移,同样也是左移1位时乘于2,右移1位时除于2。但是,对有符号整型的右移有一个特别的要求:
157178

179+
> From 周源:
180+
使用二进制补码表示方式 -> 使用二进制补码?
181+
158182
+ 有符号和无符号整型按位右移时规则相同,但有符号整型移位后出现的空位使用符号位来填充,而不是0。
159183

160184
![有符号移位操作](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
294318

295319
Swift操作符的优先级和结合性的完整规则,请看表达式。
296320

297-
> <b>注意:</b>
321+
> 注意:
298322
>
299323
> Swift操作符的优先级和结合性的规则跟C系语言不太一样,相对于C语言和Objective-C更加简单且保守。所以在移植已有代码到Swift时,注意确认操作数的计算顺序。
300324
@@ -370,6 +394,9 @@ let alsoPositive = -negative
370394

371395
加法运算之前定义过了,这里无需重新定义。加赋操作符函数使用已有的加法运算将左值加上右值:
372396

397+
> From 周源
398+
> 加赋操作符函数使用已有的加法运算将左值加上右值: -> 加法操作符... ?
399+
373400
```
374401
var original = Vector2D(x: 1.0, y: 2.0)
375402
let vectorToAdd = Vector2D(x: 3.0, y: 4.0)
@@ -388,14 +415,17 @@ original += vectorToAdd
388415

389416
这个自加操作符函数使用了前面定义过的加赋运算,将自己加上一个值为 (1.0,1.0) 的对象然后将返回值赋给自己。
390417

418+
> From 周源
419+
> 加赋运算 -> 加法运算... ?
420+
391421
```
392422
var toIncrement = Vector2D(x: 3.0, y: 4.0)
393423
let afterIncrement = ++toIncrement
394424
// toIncrement 等于(4.0, 5.0)
395425
// afterIncrement 也等于 (4.0, 5.0)
396426
```
397427

398-
> <b>注意:</b>
428+
> 注意:
399429
>
400430
> 默认的赋值符(=)是不可重载的。只有复合赋值符可以重载。条件操作符 a?b:c 也是不可重载的。
401431
@@ -431,6 +461,9 @@ println("这两个向量相等")
431461

432462
除了标准的操作符,你还可以声明一些个性的操作符,但自定义操作符只能使用这些字符`/ = - + * % < >!& | ^ . ~`
433463

464+
> From 周源:
465+
> 个性的操作符 -> 自定义的操作符 ?
466+
434467
新的操作符需要在全局域使用`operator`关键字声明,可以声明为前置,中置或后置的。
435468

436469
```
@@ -439,6 +472,10 @@ operator prefix +++ {}
439472

440473
这段代码定义了一个新的前置操作符+++,此前Swift并不存在这个操作符,此处针对`Vector2D` 对象的这个操作符具有个性化的含义。+++被定义为双自增操作符,它使用之前定义的加赋运算将自已加上自己然后返回。
441474

475+
> From 周源:
476+
> 个性化的含义 ?
477+
478+
442479
```
443480
@prefix @assignment func +++ (inout vector: Vector2D) -> Vector2D {
444481
vector += vector
@@ -476,6 +513,9 @@ let plusMinusVector = firstVector +- secondVector
476513
// plusMinusVector 是 Vector2D实例,等于 (4.0, -2.0)
477514
```
478515

516+
> From 周源:
517+
> plusMinusVector 是 Vector2D实例 -> plusMinusVector 是 Vector2D的实例 ?
518+
479519
这个操作符把两个向量的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).
480520

481521

0 commit comments

Comments
 (0)