diff --git a/source/chapter1/03_a_swift_tour.md b/source/chapter1/03_a_swift_tour.md
index 207ea9d1..544bca89 100755
--- a/source/chapter1/03_a_swift_tour.md
+++ b/source/chapter1/03_a_swift_tour.md
@@ -14,7 +14,7 @@ print("Hello, world!")
>
> 最好的体验是把这一章作为 Playground 文件在 Xcode 中打开。 Playgrounds 允许你可以编辑代码并立刻看到输出结果。
>
-> [Download Playground](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.playground.zip)
+> [Download Playground](https://docs.swift.org/swift-book/GuidedTour/GuidedTour.playground.zip)
## 简单值
diff --git a/source/chapter2/02_Basic_Operators.md b/source/chapter2/02_Basic_Operators.md
index 8612b3e3..a9bef66d 100755
--- a/source/chapter2/02_Basic_Operators.md
+++ b/source/chapter2/02_Basic_Operators.md
@@ -84,7 +84,7 @@ Swift 中所有数值类型都支持了基本的四则*算术运算符*:
我们来谈谈取余是怎么回事,计算 `9 % 4`,你先计算出 `4` 的多少倍会刚好可以容入 `9` 中:
-
+
你可以在 `9` 中放入两个 `4`,那余数是 1(用橙色标出)。
diff --git a/source/chapter2/03_Strings_and_Characters.md b/source/chapter2/03_Strings_and_Characters.md
index 2e5e3d9e..47cc62d4 100755
--- a/source/chapter2/03_Strings_and_Characters.md
+++ b/source/chapter2/03_Strings_and_Characters.md
@@ -10,7 +10,7 @@ Swift 的 `String` 和 `Character` 类型提供了一种快速且兼容 Unicode
>
> Swift 的 `String` 类型与 Foundation `NSString` 类进行了无缝桥接。Foundation 还对 `String` 进行扩展使其可以访问 `NSString` 类型中定义的方法。这意味着调用那些 `NSString` 的方法,你无需进行任何类型转换。
>
-> 更多关于在 Foundation 和 Cocoa 中使用 `String` 的信息请查看 *[Using Swift with Cocoa and Objective-C (Swift 4)](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6)*。
+> 更多关于在 Foundation 和 Cocoa 中使用 `String` 的信息请查看 *[Bridging Between String and NSString](https://developer.apple.com/documentation/swift/string#2919514)*。
## 字符串字面量
@@ -74,7 +74,7 @@ It also ends with a line break.
一个多行字符串字面量能够缩进来匹配周围的代码。关闭引号(`"""`)之前的空白字符串告诉 Swift 编译器其他各行多少空白字符串需要忽略。然而,如果你在某行的前面写的空白字符串超出了关闭引号(`"""`)之前的空白字符串,则超出部分将被包含在多行字符串字面量中。
-
+
在上面的例子中,尽管整个多行字符串字面量都是缩进的(源代码缩进),第一行和最后一行没有以空白字符串开始(实际的变量值)。中间一行的缩进用空白字符串(源代码缩进)比关闭引号(`"""`)之前的空白字符串多,所以,它的行首将有4个空格。
@@ -449,7 +449,7 @@ let newString = String(beginning)
上面的例子,`greeting` 是一个 `String`,意味着它在内存里有一片空间保存字符集。而由于 `beginning` 是 `greeting` 的 `SubString`,它重用了 `greeting` 的内存空间。相反,`newString` 是一个 `String` —— 它是使用 `SubString` 创建的,拥有一片自己的内存空间。下面的图展示了他们之间的关系:
-
+
> 注意
>
diff --git a/source/chapter2/04_Collection_Types.md b/source/chapter2/04_Collection_Types.md
index 560a3d8d..f7d09827 100755
--- a/source/chapter2/04_Collection_Types.md
+++ b/source/chapter2/04_Collection_Types.md
@@ -2,7 +2,7 @@
Swift 语言提供 `Arrays`、`Sets` 和 `Dictionaries` 三种基本的*集合类型*用来存储集合数据。数组(Arrays)是有序数据的集。集合(Sets)是无序无重复数据的集。字典(Dictionaries)是无序的键值对的集。
-
+
Swift 语言中的 `Arrays`、`Sets` 和 `Dictionaries` 中存储的数据值类型必须明确。这意味着我们不能把错误的数据类型插入其中。同时这也说明你完全可以对取回值的类型非常放心。
@@ -419,7 +419,7 @@ for genre in favoriteGenres.sorted() {
下面的插图描述了两个集合-`a` 和 `b`-以及通过阴影部分的区域显示集合各种操作的结果。
-
+
* 使用 `intersection(_:)` 方法根据两个集合中都包含的值创建的一个新的集合。
* 使用 `symmetricDifference(_:)` 方法根据在一个集合中但不在两个集合中的值创建一个新的集合。
@@ -446,7 +446,7 @@ oddDigits. symmetricDifference(singleDigitPrimeNumbers).sorted()
下面的插图描述了三个集合-`a`,`b` 和 `c`,以及通过重叠区域表述集合间共享的元素。集合 `a` 是集合 `b` 的父集合,因为 `a` 包含了 `b` 中所有的元素,相反的,集合 `b` 是集合 `a` 的子集合,因为属于 `b` 的元素也被 `a` 包含。集合 `b` 和集合 `c` 彼此不关联,因为它们之间没有共同的元素。
-
+
* 使用“是否相等”运算符(`==`)来判断两个集合是否包含全部相同的值。
* 使用 `isSubset(of:)` 方法来判断一个集合中的值是否也被包含在另外一个集合中。
diff --git a/source/chapter2/05_Control_Flow.md b/source/chapter2/05_Control_Flow.md
index 653cc830..5a7bca08 100755
--- a/source/chapter2/05_Control_Flow.md
+++ b/source/chapter2/05_Control_Flow.md
@@ -121,7 +121,7 @@ while condition {
下面的例子来玩一个叫做*蛇和梯子*(也叫做*滑道和梯子*)的小游戏:
-
+
游戏的规则如下:
@@ -430,7 +430,7 @@ default:
// 输出 "(1, 1) is inside the box"
```
-
+
在上面的例子中,`switch` 语句会判断某个点是否是原点 (0, 0),是否在红色的 x 轴上,是否在橘黄色的 y 轴上,是否在一个以原点为中心的4x4的蓝色矩形里,或者在这个矩形外面。
@@ -456,7 +456,7 @@ case let (x, y):
// 输出 "on the x-axis with an x value of 2"
```
-
+
在上面的例子中,`switch` 语句会判断某个点是否在红色的 x 轴上,是否在橘黄色的 y 轴上,或者不在坐标轴上。
@@ -486,7 +486,7 @@ case let (x, y):
// 输出 "(1, -1) is on the line x == -y"
```
-
+
在上面的例子中,`switch` 语句会判断某个点是否在绿色的对角线 `x == y` 上,是否在紫色的对角线 `x == -y` 上,或者不在对角线上。
@@ -674,7 +674,7 @@ print(description)
游戏的棋盘和之前一样:
-
+
`finalSquare`、`board`、`square` 和 `diceRoll` 值被和之前一样的方式初始化:
diff --git a/source/chapter2/10_Properties.md b/source/chapter2/10_Properties.md
index ca578bff..2de5aee1 100755
--- a/source/chapter2/10_Properties.md
+++ b/source/chapter2/10_Properties.md
@@ -155,7 +155,7 @@ print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
`center` 属性之后被设置了一个新的值 `(15, 15)`,表示向右上方移动正方形到如下图橙色正方形所示的位置。设置属性 `center` 的值会调用它的 setter 来修改属性 `origin` 的 `x` 和 `y` 的值,从而实现移动正方形到新的位置。
-
+
### 简化 Setter 声明
@@ -354,7 +354,7 @@ print(SomeClass.computedTypeProperty)
下图展示了如何把两个声道结合来模拟立体声的音量。当声道的音量是 `0`,没有一个灯会亮;当声道的音量是 `10`,所有灯点亮。本图中,左声道的音量是 `9`,右声道的音量是 `7`:
-
+
上面所描述的声道模型使用 `AudioChannel` 结构体的实例来表示:
diff --git a/source/chapter2/22_Generics.md b/source/chapter2/22_Generics.md
index e5c6ef77..526ec35c 100644
--- a/source/chapter2/22_Generics.md
+++ b/source/chapter2/22_Generics.md
@@ -128,7 +128,7 @@ swapTwoValues(&someString, &anotherString)
下图展示了一个栈的入栈(push)和出栈(pop)的行为:
-
+
1. 现在有三个值在栈中。
2. 第四个值被压入到栈的顶部。
@@ -191,7 +191,7 @@ stackOfStrings.push("cuatro")
下图展示了 `stackOfStrings` 如何将这四个值入栈:
-
+
移除并返回栈顶部的值 `"cuatro"`,即将其出栈:
@@ -202,7 +202,7 @@ let fromTheTop = stackOfStrings.pop()
下图展示了 `stackOfStrings` 如何将顶部的值出栈:
-
+
## 扩展一个泛型类型
diff --git a/source/chapter2/26_Advanced_Operators.md b/source/chapter2/26_Advanced_Operators.md
index 3356dcaf..1300d7b9 100644
--- a/source/chapter2/26_Advanced_Operators.md
+++ b/source/chapter2/26_Advanced_Operators.md
@@ -20,7 +20,7 @@ Swift 支持 C 语言中的全部位运算符,接下来会一一介绍。
*按位取反运算符(`~`)*可以对一个数值的全部比特位进行取反:
-
+
按位取反运算符是一个前缀运算符,需要直接放在运算的数之前,并且它们之间不能添加任何空格:
@@ -38,7 +38,7 @@ let invertedBits = ~initialBits // 等于 0b11110000
*按位与运算符(`&`)*可以对两个数的比特位进行合并。它返回一个新的数,只有当两个数的对应位都为 `1` 的时候,新数的对应位才为 `1`:
-
+
在下面的示例当中,`firstSixBits` 和 `lastSixBits` 中间 4 个位的值都为 `1`。按位与运算符对它们进行了运算,得到二进制数值 `00111100`,等价于无符号十进制数的 `60`:
@@ -53,7 +53,7 @@ let middleFourBits = firstSixBits & lastSixBits // 等于 00111100
*按位或运算符(`|`)*可以对两个数的比特位进行比较。它返回一个新的数,只要两个数的对应位中有任意一个为 `1` 时,新数的对应位就为 `1`:
-
+
在下面的示例中,`someBits` 和 `moreBits` 不同的位会被设置为 `1`。接位或运算符对它们进行了运算,得到二进制数值 `11111110`,等价于无符号十进制数的 `254`:
@@ -68,7 +68,7 @@ let combinedbits = someBits | moreBits // 等于 11111110
*按位异或运算符(`^`)*可以对两个数的比特位进行比较。它返回一个新的数,当两个数的对应位不相同时,新数的对应位就为 `1`:
-
+
在下面的示例当中,`firstBits` 和 `otherBits` 都有一个自己的位为 `1` 而对方的对应位为 `0` 的位。 按位异或运算符将新数的这两个位都设置为 `1`,同时将其它位都设置为 `0`:
@@ -98,7 +98,7 @@ let outputBits = firstBits ^ otherBits // 等于 00010001
以下这张图展示了 `11111111 << 1`(即把 `11111111` 向左移动 `1` 位),和 `11111111 >> 1`(即把 `11111111` 向右移动 `1` 位)的结果。蓝色的部分是被移位的,灰色的部分是被抛弃的,橙色的部分则是被填充进来的:
-
+
下面的代码演示了 Swift 中的移位运算:
@@ -139,7 +139,7 @@ let blueComponent = pink & 0x0000FF // blueComponent 是 0x99,即 153
其余的比特位(通常被称为数值位)存储了实际的值。有符号正整数和无符号数的存储方式是一样的,都是从 `0` 开始算起。这是值为 `4` 的 `Int8` 型整数的二进制位表现形式:
-
+
符号位为 `0`,说明这是一个正数,另外 7 位则代表了十进制数值 `4` 的二进制表示。
@@ -147,23 +147,23 @@ let blueComponent = pink & 0x0000FF // blueComponent 是 0x99,即 153
这是值为 `-4` 的 `Int8` 型整数的二进制位表现形式:
-
+
这次的符号位为 `1`,说明这是一个负数,另外 7 个位则代表了数值 `124`(即 `128 - 4`)的二进制表示:
-
+
负数的表示通常被称为*二进制补码*表示。用这种方法来表示负数乍看起来有点奇怪,但它有几个优点。
首先,如果想对 `-1` 和 `-4` 进行加法运算,我们只需要将这两个数的全部 8 个比特位进行相加,并且将计算结果中超出 8 位的数值丢弃:
-
+
其次,使用二进制补码可以使负数的按位左移和右移运算得到跟正数同样的效果,即每向左移一位就将自身的数值乘以 2,每向右一位就将自身的数值除以 2。要达到此目的,对有符号整数的右移有一个额外的规则:
* 当对整数进行按位右移运算时,遵循与无符号整数相同的规则,但是对于移位产生的空白位使用*符号位*进行填充,而不是用 `0`。
-
+
这个行为可以确保有符号整数的符号位不会因为右移运算而改变,这通常被称为*算术移位*。
@@ -207,7 +207,7 @@ unsignedOverflow = unsignedOverflow &+ 1
`unsignedOverflow` 被初始化为 `UInt8` 所能容纳的最大整数(`255`,以二进制表示即 `11111111`)。然后使用了溢出加法运算符(`&+`)对其进行加 `1` 运算。这使得它的二进制表示正好超出 `UInt8` 所能容纳的位数,也就导致了数值的溢出,如下图所示。数值溢出后,留在 `UInt8` 边界内的值是 `00000000`,也就是十进制数值的 `0`。
-
+
同样地,当我们对一个无符号整数使用溢出减法(`&-`)进行下溢运算时也会产生类似的现象:
@@ -220,7 +220,7 @@ unsignedOverflow = unsignedOverflow &- 1
`UInt8` 型整数能容纳的最小值是 `0`,以二进制表示即 `00000000`。当使用溢出减法运算符对其进行减 `1` 运算时,数值会产生下溢并被截断为 `11111111`, 也就是十进制数值的 `255`。
-
+
溢出也会发生在有符号整型数值上。在对有符号整型数值进行溢出加法或溢出减法运算时,符号位也需要参与计算,正如[按位左移、右移运算符](#bitwise_left_and_right_shift_operators)所描述的。
@@ -233,7 +233,7 @@ signedOverflow = signedOverflow &- 1
`Int8` 型整数能容纳的最小值是 `-128`,以二进制表示即 `10000000`。当使用溢出减法运算符对其进行减 `1` 运算时,符号位被翻转,得到二进制数值 `01111111`,也就是十进制数值的 `127`,这个值也是 `Int8` 型整数所能容纳的最大值。
-
+
对于无符号与有符号整型数值来说,当出现上溢时,它们会从数值所能容纳的最大数变成最小的数。同样地,当发生下溢时,它们会从所能容纳的最小数变成最大的数。
@@ -321,7 +321,7 @@ let combinedVector = vector + anotherVector
这个例子实现两个向量 `(3.0,1.0)` 和 `(2.0,4.0)` 的相加,并得到新的向量 `(5.0,5.0)`。这个过程如下图示:
-
+
### 前缀和后缀运算符