diff --git a/source/chapter2/03_Strings_and_Characters.md b/source/chapter2/03_Strings_and_Characters.md
index 12c31586..3a01809a 100755
--- a/source/chapter2/03_Strings_and_Characters.md
+++ b/source/chapter2/03_Strings_and_Characters.md
@@ -16,9 +16,8 @@
> 校对:[SketchK](https://github.com/SketchK)
> 3.0
-> 校对:[CMB](https://github.com/chenmingbiao)
->
-> 版本日期:2016-09-13
+> 校对:[CMB](https://github.com/chenmingbiao),版本日期:2016-09-13
+> 3.0.1, shanks, 2016-11-11
本页包含内容:
@@ -35,22 +34,22 @@
- [比较字符串](#comparing_strings)
- [字符串的 Unicode 表示形式](#unicode_representations_of_strings)
-`String`是例如"hello, world","albatross"这样的有序的`Character`(字符)类型的值的集合。通过`String`类型来表示。
-一个`String`的内容可以用许多方式读取,它包括一个`Character`值的集合。
+*字符串*是例如`"hello, world"`,`"albatross"`这样的有序的`Character`(字符)类型的值的集合。通过`String`类型来表示。
+一个`String`的内容可以用许多方式读取,包括作为一个`Character`值的集合。
-创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。
+Swift 的`String`和`Character`类型提供了快速和兼容 Unicode 的方式供你的代码使用。创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。
字符串连接操作只需要简单地通过`+`符号将两个字符串相连即可。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你也可以在字符串内插过程中使用字符串插入常量、变量、字面量表达成更长的字符串,这样可以很容易的创建自定义的字符串值,进行展示、存储以及打印。
尽管语法简易,但`String`类型是一种快速、现代化的字符串实现。
每一个字符串都是由编码无关的 Unicode 字符组成,并支持访问字符的多种 Unicode 表示形式(representations)。
> 注意:
-> Swift 的`String`类型与 Foundation `NSString`类进行了无缝桥接。就像 [`AnyObject`类型](./19_Type_Casting.html#anyobject) 中提到的一样,在使用 Cocoa 中的 Foundation 框架时,您可以将创建的任何字符串的值转换成`NSString`,并调用任意的`NSString` API。您也可以在任意要求传入`NSString`实例作为参数的 API 中用`String`类型的值代替。
-> 更多关于在 Foundation 和 Cocoa 中使用`String`的信息请查看 *[Using Swift with Cocoa and Objective-C (Swift 2.1)](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216)*。
+> Swift 的`String`类型与 Foundation `NSString`类进行了无缝桥接。Foundation 也可以对`String`进行扩展,暴露在`NSString`中定义的方法。 这意味着,如果你在`String`中调用这些`NSString`的方法,将不用进行转换。
+> 更多关于在 Foundation 和 Cocoa 中使用`String`的信息请查看 *[Using Swift with Cocoa and Objective-C (Swift 3.0.1)](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6)*。
-## 字符串字面量(String Literals)
+## 字符串字面量
您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号 (`""`) 包裹着的具有固定顺序的文本字符集。
字符串字面量可以用于为常量和变量提供初始值:
@@ -66,7 +65,7 @@ let someString = "Some string literal value"
-## 初始化空字符串 (Initializing an Empty String)
+## 初始化空字符串
要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的`String`实例:
@@ -87,7 +86,7 @@ if emptyString.isEmpty {
-## 字符串可变性 (String Mutability)
+## 字符串可变性
您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
@@ -101,14 +100,14 @@ constantString += " and another Highlander"
// 这会报告一个编译错误 (compile-time error) - 常量字符串不可以被修改。
```
-> 注意:
+> 注意:
在 Objective-C 和 Cocoa 中,您需要通过选择两个不同的类(`NSString`和`NSMutableString`)来指定字符串是否可以被修改。
-## 字符串是值类型(Strings Are Value Types)
+## 字符串是值类型
-Swift 的`String`类型是值类型。
+Swift 的`String`类型是*值类型*。
如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。
任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
值类型在 [结构体和枚举是值类型](./09_Classes_and_Structures.html#structures_and_enumerations_are_value_types) 中进行了详细描述。
@@ -121,7 +120,7 @@ Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字
-## 使用字符(Working with Characters)
+## 使用字符
您可通过`for-in`循环来遍历字符串中的`characters`属性来获取每一个字符的值:
@@ -154,7 +153,7 @@ print(catString)
-## 连接字符串和字符 (Concatenating Strings and Characters)
+## 连接字符串和字符
字符串可以通过加法运算符(`+`)相加在一起(或称“连接”)创建一个新的字符串:
@@ -181,20 +180,20 @@ welcome.append(exclamationMark)
// welcome 现在等于 "hello there!"
```
-> 注意:
+> 注意:
您不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符。
-## 字符串插值 (String Interpolation)
+## 字符串插值
-字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。
+*字符串插值*是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。
您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:
```swift
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
-// message is "3 times 2.5 is 7.5"
+// message 是 "3 times 2.5 is 7.5"
```
在上面的例子中,`multiplier`作为`\(multiplier)`被插入到一个字符串常量量中。
@@ -211,13 +210,13 @@ let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
## Unicode
-Unicode 是一个国际标准,用于文本的编码和表示。
+*Unicode*是一个国际标准,用于文本的编码和表示。
它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。
Swift 的`String`和`Character`类型是完全兼容 Unicode 标准的。
-### Unicode 标量(Unicode Scalars)
+### Unicode 标量
Swift 的`String`类型是基于 *Unicode 标量* 建立的。
Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如`U+0061`表示小写的拉丁字母(`LATIN SMALL LETTER A`)("`a`"),`U+1F425`表示小鸡表情(`FRONT-FACING BABY CHICK`) ("`🐥`")。
@@ -228,7 +227,7 @@ Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如`U+0
注意不是所有的21位 Unicode 标量都代表一个字符,因为有一些标量是留作未来分配的。已经代表一个典型字符的标量都有自己的名字,例如上面例子中的`LATIN SMALL LETTER A`和`FRONT-FACING BABY CHICK`。
-### 字符串字面量的特殊字符 (Special Characters in String Literals)
+### 字符串字面量的特殊字符
字符串字面量可以包含以下特殊字符:
@@ -248,10 +247,10 @@ let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496
```
-### 可扩展的字形群集(Extended Grapheme Clusters)
+### 可扩展的字形群集
-每一个 Swift 的`Character`类型代表一个可扩展的字形群。
-一个可扩展的字形群是一个或多个可生成人类可读的字符 Unicode 标量的有序排列。
+每一个 Swift 的`Character`类型代表一个*可扩展的字形群*。
+一个可扩展的字形群是一个或多个可生成人类可读的字符 Unicode 标量的有序排列。
举个例子,字母`é`可以用单一的 Unicode 标量`é`(`LATIN SMALL LETTER E WITH ACUTE`, 或者`U+00E9`)来表示。然而一个标准的字母`e`(`LATIN SMALL LETTER E`或者`U+0065`) 加上一个急促重音(`COMBINING ACTUE ACCENT`)的标量(`U+0301`),这样一对标量就表示了同样的字母`é`。
这个急促重音的标量形象的将`e`转换成了`é`。
@@ -291,7 +290,7 @@ let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"
```
-## 计算字符数量 (Counting Characters)
+## 计算字符数量
如果想要获得一个字符串中`Character`值的数量,可以使用字符串的`characters`属性的`count`属性:
@@ -316,19 +315,19 @@ print("the number of characters in \(word) is \(word.characters.count)")
// 打印输出 "the number of characters in café is 4"
```
-> 注意:
+> 注意:
> 可扩展的字符群集可以组成一个或者多个 Unicode 标量。这意味着不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift 中的字符在一个字符串中并不一定占用相同的内存空间数量。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量。如果您正在处理一个长字符串,需要注意`characters`属性必须遍历全部的 Unicode 标量,来确定字符串的字符数量。
>
> 另外需要注意的是通过`characters`属性返回的字符数量并不总是与包含相同字符的`NSString`的`length`属性相同。`NSString`的`length`属性是利用 UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群集。作为佐证,当一个`NSString`的`length`属性被一个Swift的`String`值访问时,实际上是调用了`utf16Count`。
-## 访问和修改字符串 (Accessing and Modifying a String)
+## 访问和修改字符串
你可以通过字符串的属性和方法来访问和修改它,当然也可以用下标语法完成。
-### 字符串索引 (String Indices)
+### 字符串索引
每一个`String`值都有一个关联的索引(*index*)类型,`String.Index`,它对应着字符串中的每一个`Character`的位置。
@@ -369,13 +368,13 @@ for index in greeting.characters.indices {
// 打印输出 "G u t e n T a g ! "
```
-> 注意:
+> 注意:
> 您可以使用 `startIndex` 和 `endIndex` 属性或者 `index(before:)` 、`index(after:)` 和 `index(_:offsetBy:)` 方法在任意一个确认的并遵循 `Collection` 协议的类型里面,如上文所示是使用在 `String` 中,您也可以使用在 `Array`、`Dictionary` 和 `Set`中。
-### 插入和删除 (Inserting and Removing)
+### 插入和删除
-调用 `insert(_:atIndex:)` 方法可以在一个字符串的指定索引插入一个字符,调用 `insert(contentsOf:at:)` 方法可以在一个字符串的指定索引插入一个段字符串。
+调用 `insert(_:at:)` 方法可以在一个字符串的指定索引插入一个字符,调用 `insert(contentsOf:at:)` 方法可以在一个字符串的指定索引插入一个段字符串。
```swift
var welcome = "hello"
@@ -402,12 +401,12 @@ welcome.removeSubrange(range)
-## 比较字符串 (Comparing Strings)
+## 比较字符串
Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。
-### 字符串/字符相等 (String and Character Equality)
+### 字符串/字符相等
字符串/字符可以用等于操作符(`==`)和不等于操作符(`!=`),详细描述在[比较运算符](./02_Basic_Operators.html#comparison_operators):
@@ -450,12 +449,12 @@ if latinCapitalLetterA != cyrillicCapitalLetterA {
// 打印 "These two characters are not equivalent"
```
-> 注意:
+> 注意:
> 在 Swift 中,字符串和字符并不区分地域(not locale-sensitive)。
-### 前缀/后缀相等 (Prefix and Suffix Equality)
+### 前缀/后缀相等
通过调用字符串的`hasPrefix(_:)`/`hasSuffix(_:)`方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个`String`类型的参数,并返回一个布尔值。
@@ -506,12 +505,12 @@ print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// 打印输出 "6 mansion scenes; 2 cell scenes"
```
-> 注意:
+> 注意:
> `hasPrefix(_:)`和`hasSuffix(_:)`方法都是在每个字符串中逐字符比较其可扩展的字符群集是否标准相等,详细描述在[字符串/字符相等](#string_and_character_equality)。
-## 字符串的 Unicode 表示形式(Unicode Representations of Strings)
+## 字符串的 Unicode 表示形式
当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的 Unicode 标量会用 Unicode 定义的几种`编码格式`(encoding forms)编码。每一个字符串中的小块编码都被称`代码单元`(code units)。这些包括 UTF-8 编码格式(编码字符串为8位的代码单元), UTF-16 编码格式(编码字符串位16位的代码单元),以及 UTF-32 编码格式(编码字符串32位的代码单元)。
@@ -640,7 +639,7 @@ print("")
第一个值为`U+D83D`(十进制值为`55357`),第二个值为`U+DC36`(十进制值为`56374`)。
-### Unicode 标量表示 (Unicode Scalars Representation)
+### Unicode 标量表示
您可以通过遍历`String`值的`unicodeScalars`属性来访问它的 Unicode 标量表示。
其为`UnicodeScalarView`类型的属性,`UnicodeScalarView`是`UnicodeScalar`类型的值的集合。