03, String and characters, for 3.0.1

This commit is contained in:
shanks
2016-11-11 21:34:35 +08:00
parent 2da452f6bf
commit 70d5c57c96

View File

@ -16,9 +16,8 @@
> 校对:[SketchK](https://github.com/SketchK) > 校对:[SketchK](https://github.com/SketchK)
> 3.0 > 3.0
> 校对:[CMB](https://github.com/chenmingbiao) > 校对:[CMB](https://github.com/chenmingbiao)版本日期2016-09-13
> > 3.0.1, shanks, 2016-11-11
> 版本日期2016-09-13
本页包含内容: 本页包含内容:
@ -35,22 +34,22 @@
- [比较字符串](#comparing_strings) - [比较字符串](#comparing_strings)
- [字符串的 Unicode 表示形式](#unicode_representations_of_strings) - [字符串的 Unicode 表示形式](#unicode_representations_of_strings)
`String`是例如"hello, world""albatross"这样的有序的`Character`(字符)类型的值的集合。通过`String`类型来表示。 *字符串*是例如`"hello, world"``"albatross"`这样的有序的`Character`(字符)类型的值的集合。通过`String`类型来表示。
一个`String`的内容可以用许多方式读取,包括一个`Character`值的集合。 一个`String`的内容可以用许多方式读取,包括作为一个`Character`值的集合。
创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。 Swift 的`String``Character`类型提供了快速和兼容 Unicode 的方式供你的代码使用。创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。
字符串连接操作只需要简单地通过`+`符号将两个字符串相连即可。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你也可以在字符串内插过程中使用字符串插入常量、变量、字面量表达成更长的字符串,这样可以很容易的创建自定义的字符串值,进行展示、存储以及打印。 字符串连接操作只需要简单地通过`+`符号将两个字符串相连即可。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你也可以在字符串内插过程中使用字符串插入常量、变量、字面量表达成更长的字符串,这样可以很容易的创建自定义的字符串值,进行展示、存储以及打印。
尽管语法简易,但`String`类型是一种快速、现代化的字符串实现。 尽管语法简易,但`String`类型是一种快速、现代化的字符串实现。
每一个字符串都是由编码无关的 Unicode 字符组成,并支持访问字符的多种 Unicode 表示形式representations 每一个字符串都是由编码无关的 Unicode 字符组成,并支持访问字符的多种 Unicode 表示形式representations
> 注意: > 注意:
> Swift 的`String`类型与 Foundation `NSString`类进行了无缝桥接。就像 [`AnyObject`类型](./19_Type_Casting.html#anyobject) 中提到的一样,在使用 Cocoa 中的 Foundation 框架时,您可以将创建的任何字符串的值转换成`NSString`,并调用任意的`NSString` API。您也可以在任意要求传入`NSString`实例作为参数的 API 中用`String`类型的值代替。 > Swift 的`String`类型与 Foundation `NSString`类进行了无缝桥接。Foundation 也可以对`String`进行扩展,暴露在`NSString`中定义的方法。 这意味着,如果你在`String`中调用这些`NSString`的方法,将不用进行转换。
> 更多关于在 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)*。 > 更多关于在 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)*。
<a name="string_literals"></a> <a name="string_literals"></a>
## 字符串字面量String Literals ## 字符串字面量
您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号 (`""`) 包裹着的具有固定顺序的文本字符集。 您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号 (`""`) 包裹着的具有固定顺序的文本字符集。
字符串字面量可以用于为常量和变量提供初始值: 字符串字面量可以用于为常量和变量提供初始值:
@ -66,7 +65,7 @@ let someString = "Some string literal value"
<a name="initializing_an_empty_string"></a> <a name="initializing_an_empty_string"></a>
## 初始化空字符串 (Initializing an Empty String) ## 初始化空字符串
要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的`String`实例: 要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的`String`实例:
@ -87,7 +86,7 @@ if emptyString.isEmpty {
<a name="string_mutability"></a> <a name="string_mutability"></a>
## 字符串可变性 (String Mutability) ## 字符串可变性
您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改: 您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
@ -106,9 +105,9 @@ constantString += " and another Highlander"
<a name="strings_are_value_types"></a> <a name="strings_are_value_types"></a>
## 字符串是值类型Strings Are Value Types ## 字符串是值类型
Swift 的`String`类型是值类型。 Swift 的`String`类型是*值类型*
如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。
任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
值类型在 [结构体和枚举是值类型](./09_Classes_and_Structures.html#structures_and_enumerations_are_value_types) 中进行了详细描述。 值类型在 [结构体和枚举是值类型](./09_Classes_and_Structures.html#structures_and_enumerations_are_value_types) 中进行了详细描述。
@ -121,7 +120,7 @@ Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字
<a name="working_with_characters"></a> <a name="working_with_characters"></a>
## 使用字符Working with Characters ## 使用字符
您可通过`for-in`循环来遍历字符串中的`characters`属性来获取每一个字符的值: 您可通过`for-in`循环来遍历字符串中的`characters`属性来获取每一个字符的值:
@ -154,7 +153,7 @@ print(catString)
<a name="concatenating_strings_and_characters"></a> <a name="concatenating_strings_and_characters"></a>
## 连接字符串和字符 (Concatenating Strings and Characters) ## 连接字符串和字符
字符串可以通过加法运算符(`+`)相加在一起(或称“连接”)创建一个新的字符串: 字符串可以通过加法运算符(`+`)相加在一起(或称“连接”)创建一个新的字符串:
@ -186,15 +185,15 @@ welcome.append(exclamationMark)
<a name="string_interpolation"></a> <a name="string_interpolation"></a>
## 字符串插值 (String Interpolation) ## 字符串插值
字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 *字符串插值*是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。
您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中: 您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:
```swift ```swift
let multiplier = 3 let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)" 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)`被插入到一个字符串常量量中。 在上面的例子中,`multiplier`作为`\(multiplier)`被插入到一个字符串常量量中。
@ -211,13 +210,13 @@ let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
<a name="unicode"></a> <a name="unicode"></a>
## Unicode ## Unicode
Unicode 是一个国际标准,用于文本的编码和表示。 *Unicode*是一个国际标准,用于文本的编码和表示。
它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。 它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。
Swift 的`String``Character`类型是完全兼容 Unicode 标准的。 Swift 的`String``Character`类型是完全兼容 Unicode 标准的。
<a name="unicode_scalars"></a> <a name="unicode_scalars"></a>
### Unicode 标量Unicode Scalars ### Unicode 标量
Swift 的`String`类型是基于 *Unicode 标量* 建立的。 Swift 的`String`类型是基于 *Unicode 标量* 建立的。
Unicode 标量是对应字符或者修饰符的唯一的21位数字例如`U+0061`表示小写的拉丁字母(`LATIN SMALL LETTER A`)("`a`")`U+1F425`表示小鸡表情(`FRONT-FACING BABY CHICK`) ("`🐥`")。 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` 注意不是所有的21位 Unicode 标量都代表一个字符,因为有一些标量是留作未来分配的。已经代表一个典型字符的标量都有自己的名字,例如上面例子中的`LATIN SMALL LETTER A``FRONT-FACING BABY CHICK`
<a name="special_characters_in_string_literals"></a> <a name="special_characters_in_string_literals"></a>
### 字符串字面量的特殊字符 (Special Characters in String Literals) ### 字符串字面量的特殊字符
字符串字面量可以包含以下特殊字符: 字符串字面量可以包含以下特殊字符:
@ -248,9 +247,9 @@ let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496
``` ```
<a name="extended_grapheme_clusters"></a> <a name="extended_grapheme_clusters"></a>
### 可扩展的字形群集(Extended Grapheme Clusters) ### 可扩展的字形群集
每一个 Swift 的`Character`类型代表一个可扩展的字形群。 每一个 Swift 的`Character`类型代表一个*可扩展的字形群*
一个可扩展的字形群是一个或多个可生成人类可读的字符 Unicode 标量的有序排列。 一个可扩展的字形群是一个或多个可生成人类可读的字符 Unicode 标量的有序排列。
举个例子,字母`é`可以用单一的 Unicode 标量`é`(`LATIN SMALL LETTER E WITH ACUTE`, 或者`U+00E9`)来表示。然而一个标准的字母`e`(`LATIN SMALL LETTER E`或者`U+0065`) 加上一个急促重音(`COMBINING ACTUE ACCENT`)的标量(`U+0301`),这样一对标量就表示了同样的字母`é` 举个例子,字母`é`可以用单一的 Unicode 标量`é`(`LATIN SMALL LETTER E WITH ACUTE`, 或者`U+00E9`)来表示。然而一个标准的字母`e`(`LATIN SMALL LETTER E`或者`U+0065`) 加上一个急促重音(`COMBINING ACTUE ACCENT`)的标量(`U+0301`),这样一对标量就表示了同样的字母`é`
这个急促重音的标量形象的将`e`转换成了`é` 这个急促重音的标量形象的将`e`转换成了`é`
@ -291,7 +290,7 @@ let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"
``` ```
<a name="counting_characters"></a> <a name="counting_characters"></a>
## 计算字符数量 (Counting Characters) ## 计算字符数量
如果想要获得一个字符串中`Character`值的数量,可以使用字符串的`characters`属性的`count`属性: 如果想要获得一个字符串中`Character`值的数量,可以使用字符串的`characters`属性的`count`属性:
@ -323,12 +322,12 @@ print("the number of characters in \(word) is \(word.characters.count)")
<a name="accessing_and_modifying_a_string"></a> <a name="accessing_and_modifying_a_string"></a>
## 访问和修改字符串 (Accessing and Modifying a String) ## 访问和修改字符串
你可以通过字符串的属性和方法来访问和修改它,当然也可以用下标语法完成。 你可以通过字符串的属性和方法来访问和修改它,当然也可以用下标语法完成。
<a name="string_indices"></a> <a name="string_indices"></a>
### 字符串索引 (String Indices) ### 字符串索引
每一个`String`值都有一个关联的索引(*index*)类型,`String.Index`,它对应着字符串中的每一个`Character`的位置。 每一个`String`值都有一个关联的索引(*index*)类型,`String.Index`,它对应着字符串中的每一个`Character`的位置。
@ -373,9 +372,9 @@ for index in greeting.characters.indices {
> 您可以使用 `startIndex` 和 `endIndex` 属性或者 `index(before:)` 、`index(after:)` 和 `index(_:offsetBy:)` 方法在任意一个确认的并遵循 `Collection` 协议的类型里面,如上文所示是使用在 `String` 中,您也可以使用在 `Array`、`Dictionary` 和 `Set`中。 > 您可以使用 `startIndex` 和 `endIndex` 属性或者 `index(before:)` 、`index(after:)` 和 `index(_:offsetBy:)` 方法在任意一个确认的并遵循 `Collection` 协议的类型里面,如上文所示是使用在 `String` 中,您也可以使用在 `Array`、`Dictionary` 和 `Set`中。
<a name="inserting_and_removing"></a> <a name="inserting_and_removing"></a>
### 插入和删除 (Inserting and Removing) ### 插入和删除
调用 `insert(_:atIndex:)` 方法可以在一个字符串的指定索引插入一个字符,调用 `insert(contentsOf:at:)` 方法可以在一个字符串的指定索引插入一个段字符串。 调用 `insert(_:at:)` 方法可以在一个字符串的指定索引插入一个字符,调用 `insert(contentsOf:at:)` 方法可以在一个字符串的指定索引插入一个段字符串。
```swift ```swift
var welcome = "hello" var welcome = "hello"
@ -402,12 +401,12 @@ welcome.removeSubrange(range)
<a name="comparing_strings"></a> <a name="comparing_strings"></a>
## 比较字符串 (Comparing Strings) ## 比较字符串
Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。 Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。
<a name="string_and_character_equality"></a> <a name="string_and_character_equality"></a>
### 字符串/字符相等 (String and Character Equality) ### 字符串/字符相等
字符串/字符可以用等于操作符(`==`)和不等于操作符(`!=`),详细描述在[比较运算符](./02_Basic_Operators.html#comparison_operators) 字符串/字符可以用等于操作符(`==`)和不等于操作符(`!=`),详细描述在[比较运算符](./02_Basic_Operators.html#comparison_operators)
@ -455,7 +454,7 @@ if latinCapitalLetterA != cyrillicCapitalLetterA {
<a name="prefix_and_suffix_equality"></a> <a name="prefix_and_suffix_equality"></a>
### 前缀/后缀相等 (Prefix and Suffix Equality) ### 前缀/后缀相等
通过调用字符串的`hasPrefix(_:)`/`hasSuffix(_:)`方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个`String`类型的参数,并返回一个布尔值。 通过调用字符串的`hasPrefix(_:)`/`hasSuffix(_:)`方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个`String`类型的参数,并返回一个布尔值。
@ -511,7 +510,7 @@ print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
<a name="unicode_representations_of_strings"></a> <a name="unicode_representations_of_strings"></a>
## 字符串的 Unicode 表示形式Unicode Representations of Strings ## 字符串的 Unicode 表示形式
当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的 Unicode 标量会用 Unicode 定义的几种`编码格式`encoding forms编码。每一个字符串中的小块编码都被称`代码单元`code units。这些包括 UTF-8 编码格式编码字符串为8位的代码单元 UTF-16 编码格式编码字符串位16位的代码单元以及 UTF-32 编码格式编码字符串32位的代码单元 当一个 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`)。 第一个值为`U+D83D`(十进制值为`55357`),第二个值为`U+DC36`(十进制值为`56374`)。
<a name="unicode_scalars_representation"></a> <a name="unicode_scalars_representation"></a>
### Unicode 标量表示 (Unicode Scalars Representation) ### Unicode 标量表示
您可以通过遍历`String`值的`unicodeScalars`属性来访问它的 Unicode 标量表示。 您可以通过遍历`String`值的`unicodeScalars`属性来访问它的 Unicode 标量表示。
其为`UnicodeScalarView`类型的属性,`UnicodeScalarView``UnicodeScalar`类型的值的集合。 其为`UnicodeScalarView`类型的属性,`UnicodeScalarView``UnicodeScalar`类型的值的集合。