Update: Strings&&Characters 修改代码格式

This commit is contained in:
Wang Hao
2014-06-10 14:45:25 +08:00
parent 6e2e44a49d
commit b53cc9f71b

View File

@ -20,7 +20,7 @@
Swift 的 **String****Character** 类型提供了一个快速的,兼容 Unicode 的方式来处理代码中的文本信息。
创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。
字符串连接操作只需要简单地通过 `+` 号将两个字符串相连即可。
字符串连接操作只需要简单地通过`+`号将两个字符串相连即可。
与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。
尽管语法简易,但 **String** 类型是一种快速、现代化的字符串实现。
@ -54,18 +54,18 @@ let someString = "Some string literal value"
> 注意:
>
> `someString` 变量通过字符串字面量进行初始化Swift 因此推断该变量为 **String** 类型。
> `someString`变量通过字符串字面量进行初始化Swift 因此推断该变量为 **String** 类型。
字符串字面量可以包含以下特殊字符:
* 转义字符 `\0` (空字符)、`\\`(反斜线)、`\t` (水平制表符)、`\n` (换行符)、`\r` (回车符)、`\"` (双引号)、`\'` (单引号)。
* 单字节 Unicode 标量,写成 `\xnn`,其中 `nn` 为两位十六进制数。
* 双字节 Unicode 标量,写成 `\unnnn`,其中 `nnnn` 为四位十六进制数。
* 四字节 Unicode 标量,写成 `\Unnnnnnnn`,其中 `nnnnnnnn` 为八位十六进制数。
* 转义字符`\0`(空字符)、`\\`(反斜线)、`\t`(水平制表符)、`\n`(换行符)、`\r`(回车符)、`\"`(双引号)、`\'`(单引号)。
* 单字节 Unicode 标量,写成`\xnn`,其中`nn`为两位十六进制数。
* 双字节 Unicode 标量,写成`\unnnn`,其中`nnnn`为四位十六进制数。
* 四字节 Unicode 标量,写成`\Unnnnnnnn`,其中`nnnnnnnn`为八位十六进制数。
下面的代码为各种特殊字符的使用示例。
`wiseWords` 常量包含了两个转移特殊字符 (双括号)
`dollarSign``blackHeart``sparklingHeart` 常量演示了三种不同格式的 Unicode 标量:
`wiseWords`常量包含了两个转移特殊字符 (双括号)
`dollarSign``blackHeart``sparklingHeart`常量演示了三种不同格式的 Unicode 标量:
```
let wiseWords = "\"我是要成为海贼王的男人\" - 路飞"
@ -89,7 +89,7 @@ var anotherEmptyString = String() // 初始化 String 实例
// 两个字符串均为空并等价。
```
您可以通过检查其 **Boolean** 类型的 `isEmpty` 属性来判断该字符串是否为空:
您可以通过检查其 **Boolean** 类型的`isEmpty`属性来判断该字符串是否为空:
```
if emptyString.isEmpty {
@ -116,7 +116,7 @@ constantString += " and another Highlander"
> 注意:
>
> 在 Objective-C 和 Cocoa 中,您通过选择两个不同的类( `NSString``NSMutableString` )来指定该字符串是否可以被修改Swift 中的字符串是否可以修改仅通过定义的是变量还是常量来决定,实现了多种类型可变性操作的统一。
> 在 Objective-C 和 Cocoa 中,您通过选择两个不同的类(`NSString``NSMutableString`)来指定该字符串是否可以被修改Swift 中的字符串是否可以修改仅通过定义的是变量还是常量来决定,实现了多种类型可变性操作的统一。
<a name="strings_are_value_types"></a>
### 字符串是值类型 (Strings Are Value Types)
@ -171,7 +171,7 @@ let yenSign: Character = "¥"
---
通过调用全局 `countElements` 函数,并将字符串作为参数进行传递,可以获取该字符串的字符数量。
通过调用全局`countElements`函数,并将字符串作为参数进行传递,可以获取该字符串的字符数量。
```
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
@ -184,11 +184,11 @@ println("unusualMenagerie has \(countElements(unusualMenagerie)) characters")
> 不同的 Unicode 字符以及相同 Unicode 字符的不同表示方式可能需要不同数量的内存空间来存储。
> 所以Swift 中的字符在一个字符串中并不一定占用相同的内存空间。
> 因此字符串的长度不得不通过迭代字符串中每一个字符的长度来进行计算。
> 如果您正在处理一个长字符串,需要注意 `countElements` 函数必须遍历字符串中的字符以精准计算字符串的长度。
> 如果您正在处理一个长字符串,需要注意`countElements`函数必须遍历字符串中的字符以精准计算字符串的长度。
>
> 另外需要注意的是通过 `countElements` 返回的字符数量并不总是与包含相同字符的 NSString 的 `length` 属性相同。
> NSString 的 `length` 属性是基于利用 UTF-16 表示的十六位代码单元数字,而不是基于 Unicode 字符。
> 为了解决这个问题NSString 的 `length` 属性在被 Swift的 **String** 访问时会成为 `utf16count`。
> 另外需要注意的是通过`countElements`返回的字符数量并不总是与包含相同字符的 NSString 的`length`属性相同。
> NSString 的`length`属性是基于利用 UTF-16 表示的十六位代码单元数字,而不是基于 Unicode 字符。
> 为了解决这个问题NSString 的`length`属性在被 Swift的 **String** 访问时会成为`utf16count`。
<a name="concatenating_strings_and_characters"></a>
### 连接字符串和字符 (Concatenating Strings and Characters)
@ -239,12 +239,12 @@ let message = "\(multiplier) 乘以 2.5 是 \(Double(multiplier) * 2.5)"
// message is "3 乘以 2.5 是 7.5"
```
在上面的例子中,`multiplier` 作为 `\(multiplier)` 被插入到一个字符串字面量中。
当创建字符串执行插值计算时此占位符会被替换为 `multiplier` 实际的值。
在上面的例子中,`multiplier`作为`\(multiplier)`被插入到一个字符串字面量中。
当创建字符串执行插值计算时此占位符会被替换为`multiplier`实际的值。
`multiplier` 的值也作为字符串中后面表达式的一部分。
该表达式计算 `Double(multiplier) * 2.5` 的值并将结果 (7.5) 插入到字符串中。
在这个例子中,表达式写为 `\(Double(multiplier) * 2.5)` 并包含在字符串字面量中。
`multiplier`的值也作为字符串中后面表达式的一部分。
该表达式计算`Double(multiplier) * 2.5`的值并将结果 (7.5) 插入到字符串中。
在这个例子中,表达式写为`\(Double(multiplier) * 2.5)`并包含在字符串字面量中。
>注意:
>
@ -274,11 +274,11 @@ if quotation == sameQuotation {
<a name="prefix_and_suffix_equality"></a>
##### 前缀/后缀相等 (Prefix and Suffix Equality)
通过调用字符串的 `hasPrefix`/`hasSuffix` 方法来检查字符串是否拥有特定前缀/后缀。
通过调用字符串的`hasPrefix`/`hasSuffix`方法来检查字符串是否拥有特定前缀/后缀。
两个方法均需要以字符串作为参数传入并传出 **Boolean** 值。
两个方法均执行基本字符串和前缀/后缀字符串之间逐个字符的比较操作。
下面的例子以一个字符串数组表示莎士比亚话剧 `罗密欧与朱丽叶` 中前两场的场景位置:
下面的例子以一个字符串数组表示莎士比亚话剧`罗密欧与朱丽叶`中前两场的场景位置:
```
let romeoAndJuliet = [
@ -296,7 +296,7 @@ let romeoAndJuliet = [
]
```
您可以利用 `hasPrefix` 方法来计算话剧中第一幕的场景数:
您可以利用`hasPrefix`方法来计算话剧中第一幕的场景数:
```
var act1SceneCount = 0
@ -312,7 +312,7 @@ println("There are \(act1SceneCount) scenes in Act 1")
<a name="uppercase_and_lowercase_strings"></a>
##### 大写和小写字符串 (Uppercase and Lowercase Strings)
您可以通过字符串的 `uppercaseString``lowercaseString` 属性来访问大写/小写版本的字符串。
您可以通过字符串的`uppercaseString``lowercaseString`属性来访问大写/小写版本的字符串。
```
let normal = "Could you help me, please?"
@ -336,25 +336,25 @@ Swift 的字符串和字符类型是完全兼容 Unicode 标准的,它支持
###### Unicode 术语 (Unicode Terminology)
Unicode 中每一个字符都可以被解释为一个或多个 unicode 标量。
字符的 unicode 标量是一个唯一的21位数字(和名称),例如 `U+0061` 表示小写的拉丁字母A ("a")`U+1F425` 表示小幺鸡表情 ("🐥")
字符的 unicode 标量是一个唯一的21位数字(和名称),例如`U+0061`表示小写的拉丁字母A ("a")`U+1F425`表示小幺鸡表情 ("🐥")
当 Unicode 字符串被写进文本文件或其他存储结构当中,这些 unicode 标量将会按照 Unicode 定义的集中格式之一进行编码。其包括 `UTF-8` (以8位代码单元进行编码) 和 `UTF-16` (以16位代码单元进行编码)。
当 Unicode 字符串被写进文本文件或其他存储结构当中,这些 unicode 标量将会按照 Unicode 定义的集中格式之一进行编码。其包括`UTF-8`(以8位代码单元进行编码) 和`UTF-16`(以16位代码单元进行编码)。
<a name="unicode_representations_of_strings"></a>
##### 字符串的 Unicode 表示 (Unicode Representations of Strings)
Swift 提供了几种不同的方式来访问字符串的 Unicode 表示。
您可以利用 `for-in` 来对字符串进行遍历,从而以 Unicode 字符的方式访问每一个字符值。
您可以利用`for-in`来对字符串进行遍历,从而以 Unicode 字符的方式访问每一个字符值。
该过程在 [Working with Characters](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-XID_376) 中进行了描述。
另外,能够以其他三种 Unicode 兼容的方式访问字符串的值:
* UTF-8 代码单元集合 (利用字符串的 `utf8` 属性进行访问)
* UTF-16 代码单元集合 (利用字符串的 `utf16` 属性进行访问)
* 21位的 Unicode 标量值集合 (利用字符串的 `unicodeScalars` 属性进行访问)
* UTF-8 代码单元集合 (利用字符串的`utf8`属性进行访问)
* UTF-16 代码单元集合 (利用字符串的`utf16`属性进行访问)
* 21位的 Unicode 标量值集合 (利用字符串的`unicodeScalars`属性进行访问)
下面由 `D` `o` `g` `!``🐶` (`DOG FACE`Unicode 标量为 `U+1F436`)组成的字符串中的每一个字符代表着一种不同的表示:
下面由`D``o``g``!``🐶`(`DOG FACE`Unicode 标量为`U+1F436`)组成的字符串中的每一个字符代表着一种不同的表示:
```
let dogString = "Dog!🐶"
@ -363,8 +363,8 @@ let dogString = "Dog!🐶"
<a name="UTF-8"></a>
##### UTF-8
您可以通过遍历字符串的 `utf8` 属性来访问它的 `UTF-8` 表示。
其为 **UTF8View** 类型的属性,**UTF8View** 是无符号8位 (`UInt8`) 值的集合,每一个 `UInt8` 值都是一个字符的 UTF-8 表示:
您可以通过遍历字符串的`utf8`属性来访问它的`UTF-8`表示。
其为 **UTF8View** 类型的属性,**UTF8View** 是无符号8位 (`UInt8`) 值的集合,每一个`UInt8`值都是一个字符的 UTF-8 表示:
```
for codeUnit in dogString.utf8 {
@ -374,14 +374,14 @@ print("\n")
// 68 111 103 33 240 159 144 182
```
上面的例子中前四个10进制代码单元值 (68, 111, 103, 33) 代表了字符 `D` `o` `g``!` ,他们的 UTF-8 表示与 ASCII 表示相同。
后四个代码单元值 (240, 159, 144, 182) 是 `DOG FACE` 的4位 UTF-8 表示。
上面的例子中前四个10进制代码单元值 (68, 111, 103, 33) 代表了字符`D``o``g``!`,他们的 UTF-8 表示与 ASCII 表示相同。
后四个代码单元值 (240, 159, 144, 182) 是`DOG FACE`的4位 UTF-8 表示。
<a name="UTF-16"></a>
##### UTF-16
您可以通过遍历字符串的 `utf16` 属性来访问它的 `UTF-16` 表示。
其为 **UTF16View** 类型的属性,**UTF16View** 是无符号16位 (`UInt16`) 值的集合,每一个 `UInt16` 都是一个字符的 UTF-16 表示:
您可以通过遍历字符串的`utf16`属性来访问它的`UTF-16`表示。
其为 **UTF16View** 类型的属性,**UTF16View** 是无符号16位 (`UInt16`) 值的集合,每一个`UInt16`都是一个字符的 UTF-16 表示:
```
for codeUnit in dogString.utf16 {
@ -391,19 +391,19 @@ print("\n")
// 68 111 103 33 55357 56374
```
同样,前四个代码单元值 (68, 111, 103, 33) 代表了字符 `D` `o` `g``!` ,他们的 UTF-16 代码单元和 UTF-8 完全相同。
同样,前四个代码单元值 (68, 111, 103, 33) 代表了字符`D``o``g``!`,他们的 UTF-16 代码单元和 UTF-8 完全相同。
第五和第六个代码单元值 (55357 and 56374) 是 `DOG FACE` 字符的UTF-16 表示。
第一个值为 `U+D83D` (十进制值为 55357),第二个值为 `U+DC36` (十进制值为 56374)。
第五和第六个代码单元值 (55357 and 56374) 是`DOG FACE`字符的UTF-16 表示。
第一个值为`U+D83D`(十进制值为 55357),第二个值为`U+DC36`(十进制值为 56374)。
<a name="unicode_scalars"></a>
##### Unicode 标量 (Unicode Scalars)
您可以通过遍历字符串的 `unicodeScalars` 属性来访问它的 Unicode 标量表示。
其为 **UnicodeScalarView** 类型的属性, **UnicodeScalarView** `UnicodeScalar` 的集合。
`UnicodeScalar` 是21位的 Unicode 代码点。
您可以通过遍历字符串的`unicodeScalars`属性来访问它的 Unicode 标量表示。
其为 **UnicodeScalarView** 类型的属性, **UnicodeScalarView**`UnicodeScalar`的集合。
`UnicodeScalar`是21位的 Unicode 代码点。
每一个 `UnicodeScalar` 拥有一个值属性可以返回对应的21位数值 `UInt32` 来表示。
每一个`UnicodeScalar`拥有一个值属性可以返回对应的21位数值`UInt32`来表示。
```
for scalar in dogString.unicodeScalars {
@ -413,11 +413,11 @@ print("\n")
// 68 111 103 33 128054
```
同样,前四个代码单元值 (68, 111, 103, 33) 代表了字符 `D` `o` `g``!`
同样,前四个代码单元值 (68, 111, 103, 33) 代表了字符`D``o``g``!`
第五位数值128054是一个十六进制1F436的十进制表示。
其等同于 `DOG FACE` 的Unicode 标量 U+1F436。
其等同于`DOG FACE`的Unicode 标量 U+1F436。
作为查询字符值属性的一种替代方法,每个 `UnicodeScalar` 值也可以用来构建一个新的字符串值,比如在字符串插值中使用:
作为查询字符值属性的一种替代方法,每个`UnicodeScalar`值也可以用来构建一个新的字符串值,比如在字符串插值中使用:
```
for scalar in dogString.unicodeScalars {
@ -430,4 +430,3 @@ for scalar in dogString.unicodeScalars {
// 🐶
```