diff --git a/source/chapter1/01_swift.md b/source/chapter1/01_swift.md
index f845f96e..f1c13a38 100755
--- a/source/chapter1/01_swift.md
+++ b/source/chapter1/01_swift.md
@@ -1,5 +1,10 @@
+> 1.0
> 翻译:[numbbbbb](https://github.com/numbbbbb)
-> 校对:[yeahdongcn](https://github.com/yeahdongcn), [xtymichael](https://github.com/xtymichael)
+> 校对:[yeahdongcn](https://github.com/yeahdongcn)
+
+> 2.0
+> 翻译+校对:[xtymichael](https://github.com/xtymichael)
+
# 关于 Swift
-----------------
diff --git a/source/chapter1/02_a_swift_tour.md b/source/chapter1/02_a_swift_tour.md
index e1ccf6b8..b2649081 100755
--- a/source/chapter1/02_a_swift_tour.md
+++ b/source/chapter1/02_a_swift_tour.md
@@ -1,6 +1,10 @@
-> 翻译:[numbbbbb](https://github.com/numbbbbb), [xtymichael](https://github.com/xtymichael)
+> 1.0
+> 翻译:[numbbbbb](https://github.com/numbbbbb)
> 校对:[shinyzhu](https://github.com/shinyzhu), [stanzhai](https://github.com/stanzhai)
+> 2.0
+> 翻译+校对:[xtymichael](https://github.com/xtymichael)
+
# Swift 初见
---
@@ -27,7 +31,7 @@ print("Hello, world")
> 注意:
> 为了获得最好的体验,在 Xcode 当中使用代码预览功能。代码预览功能可以让你编辑代码并实时看到运行结果。
-> 下载Playground
+> 下载Playground
## 简单值
diff --git a/source/chapter2/01_The_Basics.md b/source/chapter2/01_The_Basics.md
index 6f8f4727..35e84613 100755
--- a/source/chapter2/01_The_Basics.md
+++ b/source/chapter2/01_The_Basics.md
@@ -1,6 +1,10 @@
-> 翻译:[numbbbbb](https://github.com/numbbbbb), [lyuka](https://github.com/lyuka), [JaySurplus](https://github.com/JaySurplus), [xtymichael](https://github.com/xtymichael)
+> 1.0
+> 翻译:[numbbbbb](https://github.com/numbbbbb), [lyuka](https://github.com/lyuka), [JaySurplus](https://github.com/JaySurplus)
> 校对:[lslxdx](https://github.com/lslxdx)
+> 2.0
+> [xtymichael](https://github.com/xtymichael)
+
# 基础部分
-----------------
@@ -99,6 +103,12 @@ var welcomeMessage: String
welcomeMessage = "Hello"
```
+你可以在一行中定义多个同样类型的变量,用逗号分割,并在最后一个变量名之后添加类型标注:
+
+```swift
+var red, green, blue: Double
+```
+
> 注意:
一般来说你很少需要写类型标注。如果你在声明常量或者变量的时候赋了一个初始值,Swift可以推断出这个常量或者变量的类型,请参考[类型安全和类型推断](#type_safety_and_type_inference)。在上面的例子中,没有给`welcomeMessage`赋初始值,所以变量`welcomeMessage`的类型是通过一个类型标注指定的,而不是通过初始值推断的。
@@ -165,7 +175,7 @@ print("The current value of friendlyWelcome is \(friendlyWelcome)")
```
> 注意:
-字符串插值所有可用的选项,请参考[字符串插值](03_Strings_and_Characters.html#string_interpolation)。
+字符串插值所有可用的选项,请参考[字符串插值](./03_Strings_and_Characters.html#string_interpolation)。
## 注释
@@ -369,7 +379,7 @@ let twoThousandAndOne = twoThousand + UInt16(one)
现在两个数字的类型都是`UInt16`,可以进行相加。目标常量`twoThousandAndOne`的类型被推断为`UInt16`,因为它是两个`UInt16`值的和。
-`SomeType(ofInitialValue)`是调用 Swift 构造器并传入一个初始值的默认方法。在语言内部,`UInt16`有一个构造器,可以接受一个`UInt8`类型的值,所以这个构造器可以用现有的`UInt8`来创建一个新的`UInt16`。注意,你并不能传入任意类型的值,只能传入`UInt16`内部有对应构造器的值。不过你可以扩展现有的类型来让它可以接收其他类型的值(包括自定义类型),请参考[扩展](20_Extensions.html)。
+`SomeType(ofInitialValue)`是调用 Swift 构造器并传入一个初始值的默认方法。在语言内部,`UInt16`有一个构造器,可以接受一个`UInt8`类型的值,所以这个构造器可以用现有的`UInt8`来创建一个新的`UInt16`。注意,你并不能传入任意类型的值,只能传入`UInt16`内部有对应构造器的值。不过你可以扩展现有的类型来让它可以接收其他类型的值(包括自定义类型),请参考[扩展](./20_Extensions.html)。
### 整数和浮点数转换
@@ -440,7 +450,7 @@ if turnipsAreDelicious {
// 输出 "Eww, turnips are horrible."
```
-条件语句,例如`if`,请参考[控制流](05_Control_Flow.html)。
+条件语句,例如`if`,请参考[控制流](./05_Control_Flow.html)。
如果你在需要使用`Bool`类型的地方使用了非布尔值,Swift 的类型安全机制会报错。下面的例子会报告一个编译时错误:
@@ -460,7 +470,7 @@ if i == 1 {
}
```
-`i == 1`的比较结果是`Bool`类型,所以第二个例子可以通过类型检查。类似`i == 1`这样的比较,请参考[基本操作符](05_Control_Flow.html)。
+`i == 1`的比较结果是`Bool`类型,所以第二个例子可以通过类型检查。类似`i == 1`这样的比较,请参考[基本操作符](./05_Control_Flow.html)。
和 Swift 中的其他类型安全的例子一样,这个方法可以避免错误并保证这块代码的意图总是清晰的。
@@ -522,10 +532,10 @@ print("The status message is \(http200Status.description)")
// 输出 "The status message is OK"
```
-作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个`(Int, String)`元组来描述是否获取成功。和只能返回一个类型的值比较起来,一个包含两个不同类型值的元组可以让函数的返回信息更有用。请参考[函数参数与返回值](06_Functions.html#Function_Parameters_and_Return_Values)。
+作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个`(Int, String)`元组来描述是否获取成功。和只能返回一个类型的值比较起来,一个包含两个不同类型值的元组可以让函数的返回信息更有用。请参考[函数参数与返回值](./06_Functions.html#Function_Parameters_and_Return_Values)。
> 注意:
-元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。请参考[类和结构体](09_Classes_and_Structures.html)。
+元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。请参考[类和结构体](./09_Classes_and_Structures.html)。
## 可选类型
@@ -608,7 +618,7 @@ if convertedNumber != nil {
### 可选绑定
-使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在`if`和`while`语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。`if`和`while`语句,请参考[控制流](05_Control_Flow.html)。
+使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在`if`和`while`语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。`if`和`while`语句,请参考[控制流](./05_Control_Flow.html)。
像下面这样在`if`语句中写一个可选绑定:
@@ -654,7 +664,7 @@ if let constantName = someOptional, anotherConstantName = someOtherOptional {
这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(`String?`)改成感叹号(`String!`)来声明一个隐式解析可选类型。
-当可选类型被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选类型非常有用。隐式解析可选类型主要被用在 Swift 中类的构造过程中,请参考[类实例之间的循环强引用](16_Automatic_Reference_Counting.html#strong_reference_cycles_between_class_instances)。
+当可选类型被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选类型非常有用。隐式解析可选类型主要被用在 Swift 中类的构造过程中,请参考[无主引用以及隐式解析可选属性](./16_Automatic_Reference_Counting.html#unowned_references_and_implicitly_unwrapped_optional_properties)。
一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。下面的例子展示了可选类型`String`和隐式解析可选类型`String`之间的区别:
@@ -740,7 +750,7 @@ do {
如果没有错误被抛出, `eatASandwich()`函数会被调用。如果一个符合`Error.OutOfCleanDishes`的错误被抛出,`washDishes`函数会被调用。如果一个符合`Error.MissingIngredients`的错误被抛出,`buyGroceries(_:)`函数会被调用并传递相关被`catch`所捕捉到的`[String]`值。
-抛出,捕捉,传递错误会在[错误处理](../chapter2/18_Error_Handling.html)章节详细说明。
+抛出,捕捉,传递错误会在[错误处理](./18_Error_Handling.html)章节详细说明。
## 断言
@@ -777,7 +787,7 @@ assert(age >= 0)
* 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
* 一个可选值现在是`nil`,但是后面的代码运行需要一个非`nil`值。
-请参考[下标脚本](12_Subscripts.html)和[函数](06_Functions.html)。
+请参考[下标脚本](./12_Subscripts.html)和[函数](./06_Functions.html)。
> 注意:
断言可能导致你的应用终止运行,所以你应当仔细设计你的代码来让非法条件不会出现。然而,在你的应用发布之前,有时候非法条件可能出现,这时使用断言可以快速发现问题。
diff --git a/source/chapter2/02_Basic_Operators.md b/source/chapter2/02_Basic_Operators.md
index dc6a1b8b..89beb3c1 100755
--- a/source/chapter2/02_Basic_Operators.md
+++ b/source/chapter2/02_Basic_Operators.md
@@ -1,6 +1,9 @@
+> 1.0
+> 翻译:[XieLingWang](https://github.com/xielingwang)
+> 校对:[EvilCome](https://github.com/Evilcome)
-> 翻译:[XieLingWang](https://github.com/xielingwang), [JackAlan](https://github.com/AlanMelody)
-> 校对:[EvilCome](https://github.com/Evilcome), [JackAlan](https://github.com/AlanMelody)
+> 2.0
+> 翻译+校对:[JackAlan](https://github.com/AlanMelody)
# 基本运算符
-----------------
@@ -19,11 +22,11 @@
运算符是检查、改变、合并值的特殊符号或短语。例如,加号`+`将两个数相加(如`let i = 1 + 2`)。更复杂的运算例子包括逻辑与运算符`&&`(如`if enteredDoorCode && passedRetinaScan`),或让 i 值加1的便捷自增运算符`++i`等。
-Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误。如:赋值符(`=`)不返回值,以防止把想要判断相等运算符(`==`)的地方写成赋值符导致的错误。算术运算符(`+`,`-`,`*`,`/`,`%`等)会检测并不允许值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。当然允许你使用 Swift 的溢出运算符来实现溢出。详情参见[溢出运算符](24_Advanced_Operators.html#overflow_operators)。
+Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误。如:赋值符(`=`)不返回值,以防止把想要判断相等运算符(`==`)的地方写成赋值符导致的错误。算术运算符(`+`,`-`,`*`,`/`,`%`等)会检测并不允许值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。当然允许你使用 Swift 的溢出运算符来实现溢出。详情参见[溢出运算符](./24_Advanced_Operators.html#overflow_operators)。
区别于 C 语言,在 Swift 中你可以对浮点数进行取余运算(`%`),Swift 还提供了 C 语言没有的表达两数之间的值的区间运算符(`a..
## 术语
@@ -77,7 +80,7 @@ Swift 中所有数值类型都支持了基本的四则算术运算:
-与 C 语言和 Objective-C 不同的是,Swift 默认情况下不允许在数值运算中出现溢出情况。但是你可以使用 Swift 的溢出运算符来实现溢出运算(如`a &+ b`)。详情参见[溢出运算符](24_Advanced_Operators.html#overflow_operators)。
+与 C 语言和 Objective-C 不同的是,Swift 默认情况下不允许在数值运算中出现溢出情况。但是你可以使用 Swift 的溢出运算符来实现溢出运算(如`a &+ b`)。详情参见[溢出运算符](./24_Advanced_Operators.html#overflow_operators)。
加法运算符也可用于`String`的拼接:
@@ -215,7 +218,7 @@ Swift 中所有数值类型都支持了基本的四则算术运算:
- 小于等于(`a <= b`)
> 注意:
-Swift 也提供恒等`===`和不恒等`!==`这两个比较符来判断两个对象是否引用同一个对象实例。更多细节在[类与结构](09_Classes_and_Structures.html)。
+Swift 也提供恒等`===`和不恒等`!==`这两个比较符来判断两个对象是否引用同一个对象实例。更多细节在[类与结构](./09_Classes_and_Structures.html)。
每个比较运算都返回了一个标识表达式是否成立的布尔值:
@@ -240,7 +243,7 @@ Swift 也提供恒等`===`和不恒等`!==`这两个比较符来判断两个对
// 输出 "hello, world", 因为 `name` 就是等于 "world"
-关于`if`语句,请看[控制流](05_Control_Flow.html)。
+关于`if`语句,请看[控制流](./05_Control_Flow.html)。
## 三目运算符(Ternary Conditional Operator)
@@ -335,7 +338,7 @@ Swift 提供了两个方便表达一个区间的值的运算符。
// 5 * 5 = 25
-关于`for-in`,请看[控制流](05_Control_Flow.html)。
+关于`for-in`,请看[控制流](./05_Control_Flow.html)。
### 半开区间运算符
@@ -356,7 +359,7 @@ Swift 提供了两个方便表达一个区间的值的运算符。
// 第 4 个人叫 Jack
-数组有4个元素,但`0..
## 逻辑运算
@@ -434,10 +437,10 @@ Swift 提供了两个方便表达一个区间的值的运算符。
如果我们输入了正确的密码并通过了视网膜扫描; 或者我们有一把有效的钥匙; 又或者我们知道紧急情况下重置的密码,我们就能把门打开进入。
-前两种情况,我们都不满足,所以前两个简单逻辑的结果是`false`,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是`true`。
-
->注意:
-Swift 逻辑操作符`&&`和`||`是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
+前两种情况,我们都不满足,所以前两个简单逻辑的结果是`false`,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是`true`。
+
+>注意:
+Swift 逻辑操作符`&&`和`||`是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
### 使用括号来明确优先级
diff --git a/source/chapter2/03_Strings_and_Characters.md b/source/chapter2/03_Strings_and_Characters.md
index 98164903..c8a1c31a 100755
--- a/source/chapter2/03_Strings_and_Characters.md
+++ b/source/chapter2/03_Strings_and_Characters.md
@@ -1,11 +1,15 @@
-> 翻译:[wh1100717](https://github.com/wh1100717)
-> 校对:[Hawstein](https://github.com/Hawstein)
-
-# 字符串和字符(Strings and Characters)
----
-
-本页包含内容:
-
+> 1.0
+> 翻译:[wh1100717](https://github.com/wh1100717)
+> 校对:[Hawstein](https://github.com/Hawstein)
+
+> 2.0
+> 翻译+校对:[DianQK](https://github.com/DianQK)
+
+# 字符串和字符(Strings and Characters)
+---
+
+本页包含内容:
+
- [字符串字面量](#string_literals)
- [初始化空字符串](#initializing_an_empty_string)
- [字符串可变性](#string_mutability)
@@ -17,59 +21,59 @@
- [计算字符数量](#counting_characters)
- [访问和修改字符串](#accessing_and_modifying_a_string)
- [比较字符串](#comparing_strings)
-- [字符串的 Unicode 表示形式](#unicode_representations_of_strings)
-
-
-`String`是例如"hello, world","albatross"这样的有序的`Character`(字符)类型的值的集合,通过`String`类型来表示。
+- [字符串的 Unicode 表示形式](#unicode_representations_of_strings)
+
+
+`String`是例如"hello, world","albatross"这样的有序的`Character`(字符)类型的值的集合,通过`String`类型来表示。
Swift 的`String`和`Character`类型提供了一个快速的,兼容 Unicode 的方式来处理代码中的文本。
创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。
字符串连接操作只需要简单地通过`+`符号将两个字符串相连即可。
-与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。
+与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。
尽管语法简易,但`String`类型是一种快速、现代化的字符串实现。
-每一个字符串都是由编码无关的 Unicode 字符组成,并支持访问字符的多种 Unicode 表示形式(representations)。
-你也可以在常量、变量、字面量和表达式中进行字符串插值操作,这可以帮助你轻松创建用于展示、存储和打印的自定义字符串。
-
+每一个字符串都是由编码无关的 Unicode 字符组成,并支持访问字符的多种 Unicode 表示形式(representations)。
+你也可以在常量、变量、字面量和表达式中进行字符串插值操作,这可以帮助你轻松创建用于展示、存储和打印的自定义字符串。
+
> 注意:
-> Swift 的`String`类型与 Foundation `NSString`类进行了无缝桥接。就像 [AnyObject](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID343) 中提到的一样,在使用 Cocoa 中的 Foundation 框架时,您可以将创建的任何字符串的值转换成`NSString`,并调用任意的`NSString` API。您也可以在任意要求传入`NSString`实例作为参数的 API 中用`String`类型的值代替。
+> Swift 的`String`类型与 Foundation `NSString`类进行了无缝桥接。就像 [`AnyObject`类型](./20_Type_Casting.html#anyobject) 中提到的一样,在使用 Cocoa 中的 Foundation 框架时,您可以将创建的任何字符串的值转换成`NSString`,并调用任意的`NSString` API。您也可以在任意要求传入`NSString`实例作为参数的 API 中用`String`类型的值代替。
> 更多关于在 Foundation 和 Cocoa 中使用`String`的信息请查看 *[Using Swift with Cocoa and Objective-C](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216)*。
-
-
-## 字符串字面量(String Literals)
-
+
+
+## 字符串字面量(String Literals)
+
您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号 ("") 包裹着的具有固定顺序的文本字符集。
-字符串字面量可以用于为常量和变量提供初始值:
-```let someString = "Some string literal value"```
-注意`someString`常量通过字符串字面量进行初始化,Swift 会推断该常量为`String`类型。
+字符串字面量可以用于为常量和变量提供初始值:
+```let someString = "Some string literal value"```
+注意`someString`常量通过字符串字面量进行初始化,Swift 会推断该常量为`String`类型。
> 注意:
> 更多关于在字面量的特殊字符,请查看 [Special Characters in String Literals](#special_characters_in_string_literals) 。
-
-
-## 初始化空字符串 (Initializing an Empty String)
-
+
+
+## 初始化空字符串 (Initializing an Empty String)
+
要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的`String`实例:
-
+
```swift
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
// 两个字符串均为空并等价。
-```
-
-您可以通过检查其`Boolean`类型的`isEmpty`属性来判断该字符串是否为空:
+```
+
+您可以通过检查其`Boolean`类型的`isEmpty`属性来判断该字符串是否为空:
```swift
if emptyString.isEmpty {
print("Nothing to see here")
}
// 打印输出:"Nothing to see here"
-```
-
-
-## 字符串可变性 (String Mutability)
-
-您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
-
+```
+
+
+## 字符串可变性 (String Mutability)
+
+您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
+
```swift
var variableString = "Horse"
variableString += " and carriage"
@@ -77,33 +81,33 @@ variableString += " and carriage"
let constantString = "Highlander"
constantString += " and another Highlander"
// 这会报告一个编译错误 (compile-time error) - 常量不可以被修改。
-```
-
+```
+
> 注意:
-> 在 Objective-C 和 Cocoa 中,您需要通过选择两个不同的类(`NSString`和`NSMutableString`)来指定该字符串是否可以被修改。
-
-
-## 字符串是值类型(Strings Are Value Types)
-
+> 在 Objective-C 和 Cocoa 中,您需要通过选择两个不同的类(`NSString`和`NSMutableString`)来指定该字符串是否可以被修改。
+
+
+## 字符串是值类型(Strings Are Value Types)
+
Swift 的`String`类型是值类型。
如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。
-任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
-值类型在 [结构体和枚举是值类型](09_Classes_and_Structures.html#structures_and_enumerations_are_value_types) 中进行了详细描述。
-
+任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
+值类型在 [结构体和枚举是值类型](./09_Classes_and_Structures.html#structures_and_enumerations_are_value_types) 中进行了详细描述。
+
> 注意:
-> 与 Cocoa 中的`NSString`不同,当您在 Cocoa 中创建了一个`NSString`实例,并将其传递给一个函数/方法,或者赋值给一个变量,您传递或赋值的是该`NSString`实例的一个引用,除非您特别要求进行值拷贝,否则字符串不会生成新的副本来进行赋值操作。
-
-Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。
-很明显无论该值来自于哪里,都是您独自拥有的。
-您可以放心您传递的字符串本身不会被更改。
-
-在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能。
-
-
-## 使用字符(Working with Characters)
-
-您可通过`for-in`循环来遍历字符串中的`characters`属性来获取每一个字符的值:
-
+> 与 Cocoa 中的`NSString`不同,当您在 Cocoa 中创建了一个`NSString`实例,并将其传递给一个函数/方法,或者赋值给一个变量,您传递或赋值的是该`NSString`实例的一个引用,除非您特别要求进行值拷贝,否则字符串不会生成新的副本来进行赋值操作。
+
+Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。
+很明显无论该值来自于哪里,都是您独自拥有的。
+您可以放心您传递的字符串本身不会被更改。
+
+在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能。
+
+
+## 使用字符(Working with Characters)
+
+您可通过`for-in`循环来遍历字符串中的`characters`属性来获取每一个字符的值:
+
```swift
for character in "Dog!🐶".characters {
print(character)
@@ -113,12 +117,12 @@ for character in "Dog!🐶".characters {
// g
// !
// 🐶
-```
-
-for-in 循环在 [For Loops](05_Control_Flow.html#for_loops) 中进行了详细描述。
-
-另外,通过标明一个`Character`类型并用字符字面量进行赋值,可以建立一个独立的字符常量或变量:
-
+```
+
+for-in 循环在 [For Loops](./05_Control_Flow.html#for_loops) 中进行了详细描述。
+
+另外,通过标明一个`Character`类型并用字符字面量进行赋值,可以建立一个独立的字符常量或变量:
+
```swift
let exclamationMark: Charater = "!"
```
@@ -131,96 +135,96 @@ print(catString)
// 打印输出:"Cat!🐱"
```
-
-## 连接字符串和字符 (Concatenating Strings and Characters)
-
-字符串可以通过加法运算符(`+`)相加在一起(或称“连接”)创建一个新的字符串:
-
+
+## 连接字符串和字符 (Concatenating Strings and Characters)
+
+字符串可以通过加法运算符(`+`)相加在一起(或称“连接”)创建一个新的字符串:
+
```swift
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome 现在等于 "hello there"
-```
-
-您也可以通过加法赋值运算符 (`+=`) 将一个字符串添加到一个已经存在字符串变量上:
-
+```
+
+您也可以通过加法赋值运算符 (`+=`) 将一个字符串添加到一个已经存在字符串变量上:
+
```swift
var instruction = "look over"
instruction += string2
// instruction 现在等于 "look over there"
```
-
-您可以用`append`方法将一个字符附加到一个字符串变量的尾部:
-
+
+您可以用`append`方法将一个字符附加到一个字符串变量的尾部:
+
```swift
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome 现在等于 "hello there!"
-```
-
+```
+
> 注意:
> 您不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符。
-
-## 字符串插值 (String Interpolation)
-
-字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。
-您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:
-
+
+## 字符串插值 (String Interpolation)
+
+字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。
+您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:
+
```swift
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5"
-```
-
-在上面的例子中,`multiplier`作为`\(multiplier)`被插入到一个字符串字面量中。
-当创建字符串执行插值计算时此占位符会被替换为`multiplier`实际的值。
-
-`multiplier`的值也作为字符串中后面表达式的一部分。
-该表达式计算`Double(multiplier) * 2.5`的值并将结果 (7.5) 插入到字符串中。
-在这个例子中,表达式写为`\(Double(multiplier) * 2.5)`并包含在字符串字面量中。
-
+```
+
+在上面的例子中,`multiplier`作为`\(multiplier)`被插入到一个字符串字面量中。
+当创建字符串执行插值计算时此占位符会被替换为`multiplier`实际的值。
+
+`multiplier`的值也作为字符串中后面表达式的一部分。
+该表达式计算`Double(multiplier) * 2.5`的值并将结果 (7.5) 插入到字符串中。
+在这个例子中,表达式写为`\(Double(multiplier) * 2.5)`并包含在字符串字面量中。
+
> 注意:
> 插值字符串中写在括号中的表达式不能包含非转义双引号 (`"`) 和反斜杠 (`\`),并且不能包含回车或换行符。
-
+
-## Unicode
-
-Unicode 是一个国际标准,用于文本的编码和表示。
-它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。
+## Unicode
+
+Unicode 是一个国际标准,用于文本的编码和表示。
+它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。
Swift 的字符串和字符类型是完全兼容 Unicode 标准的。
### Unicode 标量(Unicode Scalars)
-
-Swift 的`String`类型是基于 *Unicode 标量* 建立的。
+
+Swift 的`String`类型是基于 *Unicode 标量* 建立的。
Unicode 标量是对应字符的唯一21位数字或者修饰符,例如`U+0061`表示小写的拉丁字母(`LATIN SMALL LETTER A`)("`a`"),`U+1F425`表示小鸡表情(`FRONT-FACING BABY CHICK`) ("`🐥`")
> 注意:
-> Unicode *码位(code poing)* 的范围是`U+0000`到`U+D7FF`或者`U+E000`到`U+10FFFF`。Unicode 标量不包括 Unicode *代理项(surrogate pair)* 码位,其码位范围是`U+D800`到`U+DFFF`。
+> Unicode *码位(code poing)* 的范围是`U+0000`到`U+D7FF`或者`U+E000`到`U+10FFFF`。Unicode 标量不包括 Unicode *代理项(surrogate pair)* 码位,其码位范围是`U+D800`到`U+DFFF`。
注意不是所有的21位 Unicode 标量都代表一个字符,因为有一些标量是保留给未来分配的。已经代表一个典型字符的标量都有自己的名字,例如上面例子中的`LATIN SMALL LETTER A`和`FRONT-FACING BABY CHICK`。
### 字符串字面量的特殊字符 (Special Characters in String Literals)
-
+
字符串字面量可以包含以下特殊字符:
-
-* 转义字符`\0`(空字符)、`\\`(反斜线)、`\t`(水平制表符)、`\n`(换行符)、`\r`(回车符)、`\"`(双引号)、`\'`(单引号)。
-* Unicode 标量,写成`\u{n}`(u为小写),其中`n`为任意一到八位十六进制数且可用的 Unicode 位码。
-
-下面的代码为各种特殊字符的使用示例。
-`wiseWords`常量包含了两个双引号;
-`dollarSign`、`blackHeart`和`sparklingHeart`常量演示了三种不同格式的 Unicode 标量:
-
-```swift
+
+* 转义字符`\0`(空字符)、`\\`(反斜线)、`\t`(水平制表符)、`\n`(换行符)、`\r`(回车符)、`\"`(双引号)、`\'`(单引号)。
+* Unicode 标量,写成`\u{n}`(u为小写),其中`n`为任意一到八位十六进制数且可用的 Unicode 位码。
+
+下面的代码为各种特殊字符的使用示例。
+`wiseWords`常量包含了两个双引号;
+`dollarSign`、`blackHeart`和`sparklingHeart`常量演示了三种不同格式的 Unicode 标量:
+
+```swift
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imageination is more important than knowledge" - Enistein
let dollarSign = "\u{24}" // $, Unicode 标量 U+0024
let blackHeart = "\u{2665}" // ♥, Unicode 标量 U+2665
-let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496
+let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496
```
@@ -262,22 +266,22 @@ let enclosedEAcute: Character = "\u{E9}\u{20DD}"
```swift
let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"
// regionalIndicatorForUS 是 🇺🇸
-```
-
-
-## 计算字符数量 (Counting Characters)
+```
+
+
+## 计算字符数量 (Counting Characters)
调用字符串的`count`属性,就可以获取一个字符串的字符数量:
-
-
+
+
```swift
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
-// 打印输出:"unusualMenagerie has 40 characters"
+// 打印输出:"unusualMenagerie has 40 characters"
```
注意在 Swift 中,使用可拓展的字符群集作为字符来连接或改变字符串时,并不一定会更改字符串的字符数量。
-例如,如果你用四个字符的单词 cafe 初始化一个新的字符串,然后添加一个 `COMBINING ACTUE ACCENT`(`U+0301`)作为字符串的结尾。最终这个字符串的字符数量仍然是4,因为第四个字符是 é ,而不是 e :
+例如,如果你用四个字符的单词 cafe 初始化一个新的字符串,然后添加一个 `COMBINING ACTUE ACCENT`(`U+0301`)作为字符串的结尾。最终这个字符串的字符数量仍然是4,因为第四个字符是 é ,而不是 e :
```swift
var word = "cafe"
@@ -287,9 +291,9 @@ word += "\u{301}" // COMBINING ACUTE ACCENT, U+0301
print("the number of characters in \(word) is \(word.characters.count)")
// 打印输出 "the number of characters in café is 4"
```
-
+
> 注意:
-> 可扩展的字符群集可以组成一个或者多个 Unicode 标量。这意味着不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift 中的字符在一个字符串中并不一定占用相同的内存空间数量。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量。如果您正在处理一个长字符串,需要注意`characters`属性必须遍历全部的 Unicode 标量,来确定字符串的字符数量。
+> 可扩展的字符群集可以组成一个或者多个 Unicode 标量。这意味着不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift 中的字符在一个字符串中并不一定占用相同的内存空间数量。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量。如果您正在处理一个长字符串,需要注意`characters`属性必须遍历全部的 Unicode 标量,来确定字符串的字符数量。
> 另外需要注意的是通过`characters`返回的字符数量并不总是与包含相同字符的`NSString`的`length`属性相同。`NSString`的`length`属性是利用 UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群集。
@@ -361,24 +365,24 @@ let range = advance(welcome.endIndex, -6)..
-## 比较字符串 (Comparing Strings)
-
-Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。
-
-
+
+
+
+## 比较字符串 (Comparing Strings)
+
+Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。
+
+
### 字符串/字符相等 (String and Character Equality)
-字符串/字符可以用等于操作符(`==`)和不等于操作符(`!=`),详细描述在 [Comparison Operators](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-ID70):
-
+字符串/字符可以用等于操作符(`==`)和不等于操作符(`!=`),详细描述在[比较运算符](./02_Basic_Operators.html#comparison_operators):
+
```swift
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
print("These two strings are considered equal")
}
-// 打印输出 "These two strings are considered equal"
+// 打印输出 "These two strings are considered equal"
```
如果两个字符串(或者两个字符)的可扩展的字形群集是标准相等的,那就认为它们是相等的。在这个情况下,即使可扩展的字形群集是有不同的 Unicode 标量构成的,只要它们有同样的语言意义和外观,就认为它们标准相等。
@@ -404,18 +408,18 @@ if latinCapitalLetterA != cyrillicCapitalLetterA {
print("These two characters are not equivalent")
}
// 打印 "These two characters are not equivalent"
-```
+```
> 注意:
> 在 Swift 中,字符串和字符并不区分区域。
-
-
-### 前缀/后缀相等 (Prefix and Suffix Equality)
-
+
+
+### 前缀/后缀相等 (Prefix and Suffix Equality)
+
通过调用字符串的`hasPrefix(_:)`/`hasSuffix(_:)`方法来检查字符串是否拥有特定前缀/后缀,两个方法均需要以字符串作为参数传入并传出`Boolean`值。
-下面的例子以一个字符串数组表示莎士比亚话剧《罗密欧与朱丽叶》中前两场的场景位置:
-
+下面的例子以一个字符串数组表示莎士比亚话剧《罗密欧与朱丽叶》中前两场的场景位置:
+
```swift
let romeoAndJuliet = [
"Act 1 Scene 1: Verona, A public place",
@@ -429,11 +433,11 @@ let romeoAndJuliet = [
"Act 2 Scene 4: A street in Verona",
"Act 2 Scene 5: Capulet's mansion",
"Act 2 Scene 6: Friar Lawrence's cell"
-]
-```
-
-您可以调用`hasPrefix(_:)`方法来计算话剧中第一幕的场景数:
-
+]
+```
+
+您可以调用`hasPrefix(_:)`方法来计算话剧中第一幕的场景数:
+
```swift
var act1SceneCount = 0
for scene in romeoAndJuliet {
@@ -442,11 +446,11 @@ for scene in romeoAndJuliet {
}
}
print("There are \(act1SceneCount) scenes in Act 1")
-// 打印输出 "There are 5 scenes in Act 1"
-```
-
-相似地,您可以用`hasSuffix(_:)`方法来计算发生在不同地方的场景数:
-
+// 打印输出 "There are 5 scenes in Act 1"
+```
+
+相似地,您可以用`hasSuffix(_:)`方法来计算发生在不同地方的场景数:
+
```swift
var mansionCount = 0
var cellCount = 0
@@ -458,37 +462,37 @@ for scene in romeoAndJuliet {
}
}
print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
-// 打印输出 "6 mansion scenes; 2 cell scenes"
+// 打印输出 "6 mansion scenes; 2 cell scenes"
```
> 注意:
> `hasPrefix(_:)`和`hasSuffix(_:)`方法都是在每个字符串中一个一个字符的比较其可扩展的字符群集是否标准相等,详细描述在[字符串/字符相等](#string_and_character_equality)。
-
-
+
+
## 字符串的 Unicode 表示形式(Unicode Representations of Strings)
-当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的 Unicode 标量会用 Unicode 定义的几种编码格式编码。每一个字符串中的小块编码都被称为代码单元。这些包括 UTF-8 编码格式(编码字符串为8位的代码单元), UTF-16 编码格式(编码字符串位16位的代码单元),以及 UTF-32 编码格式(编码字符串32位的代码单元)。
-
+当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的 Unicode 标量会用 Unicode 定义的几种编码格式编码。每一个字符串中的小块编码都被称为代码单元。这些包括 UTF-8 编码格式(编码字符串为8位的代码单元), UTF-16 编码格式(编码字符串位16位的代码单元),以及 UTF-32 编码格式(编码字符串32位的代码单元)。
+
Swift 提供了几种不同的方式来访问字符串的 Unicode 表示形式。
您可以利用`for-in`来对字符串进行遍历,从而以 Unicode 可扩展的字符群集的方式访问每一个字符值。
-该过程在 [使用字符](#working_with_characters) 中进行了描述。
-
-另外,能够以其他三种 Unicode 兼容的方式访问字符串的值:
-
-* UTF-8 代码单元集合 (利用字符串的`utf8`属性进行访问)
-* UTF-16 代码单元集合 (利用字符串的`utf16`属性进行访问)
-* 21位的 Unicode 标量值集合,也就是字符串的 UTF-32 编码格式 (利用字符串的`unicodeScalars`属性进行访问)
-
-下面由`D``o``g``‼`(`DOUBLE EXCLAMATION MARK`, Unicode 标量 `U+203C`)和`🐶`(`DOG FACE`,Unicode 标量为`U+1F436`)组成的字符串中的每一个字符代表着一种不同的表示:
-
+该过程在 [使用字符](#working_with_characters) 中进行了描述。
+
+另外,能够以其他三种 Unicode 兼容的方式访问字符串的值:
+
+* UTF-8 代码单元集合 (利用字符串的`utf8`属性进行访问)
+* UTF-16 代码单元集合 (利用字符串的`utf16`属性进行访问)
+* 21位的 Unicode 标量值集合,也就是字符串的 UTF-32 编码格式 (利用字符串的`unicodeScalars`属性进行访问)
+
+下面由`D``o``g``‼`(`DOUBLE EXCLAMATION MARK`, Unicode 标量 `U+203C`)和`🐶`(`DOG FACE`,Unicode 标量为`U+1F436`)组成的字符串中的每一个字符代表着一种不同的表示:
+
```swift
-let dogString = "Dog‼🐶"
+let dogString = "Dog‼🐶"
```
-
-
-
-### UTF-8 表示
-您可以通过遍历字符串的`utf8`属性来访问它的`UTF-8`表示。
+
+
+
+### UTF-8 表示
+您可以通过遍历字符串的`utf8`属性来访问它的`UTF-8`表示。
其为`String.UTF8View`类型的属性,`UTF8View`是无符号8位 (`UInt8`) 值的集合,每一个`UInt8`值都是一个字符的 UTF-8 表示:
@@ -530,25 +534,25 @@ let dogString = "Dog‼🐶"
-
-
+
@@ -582,28 +586,28 @@ print("")
@@ -636,22 +640,22 @@ print("")