首页 Swift 5.1 学习: (7) 字符串和字符
文章
取消

Swift 5.1 学习: (7) 字符串和字符

Swift 中的 String 类型是由 Foundation 框架中的 NSString 类桥接而来. Foundation 框架还对 String 扩展了 NSString 定义的方法. 因此如果你导入了 Foundation 框架, 就可以直接对 String 调用 NSString 的方法.

字符串字面值

字符串的定义和 C语言 中的比较像:

1
let someString = "Some string literal value"

多行字符串

Swift 中可以使用 3 个双引号定义多行字符串:

1
2
3
4
5
6
7
let quotation = """
The White Rabbit put on his spectacles.  "Where shall I begin,
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""

以上多行字符串包含了引号内的所有内容: 字符串, 换行符 等.

如果你不想让字符串内包含换行符, 可以在每行的结尾使用 "\" 来进行处理:

1
2
3
4
5
6
7
let softWrappedQuotation = """
The White Rabbit put on his spectacles.  "Where shall I begin, \
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on \
till you come to the end; then stop."
"""

有时候我们可能会需要利用 缩进 来使我们的代码更加方便阅读. 这时候我们可以我们需要指明哪些空格是需要忽略的, 不计入字符串内容: 做法如下图:

此处, 在我们的字符串结束部分的 """ 前面有 4 个 空格, 就意味着忽略每行的前 4 个空格.

特殊字符

字符串中也可以包含一些特殊字符:

字符 含义
\0 空字符
\n 换行符
\r 回车
\t 制表符
\\ 斜杠
\" 双引号
\' 单引号
Unicode 值 \u{n}, 其中 n 是 1-8 位的十六进制数字

如下事例, wiseWords 因为其中包含了 ", 因此使用 \ 来进行转义 :

1
2
3
4
5
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\u{24}"        // $,  Unicode 值 U+0024
let blackHeart = "\u{2665}"      // ,  Unicode 值 U+2665
let sparklingHeart = "\u{1F496}" // , Unicode 值 U+1F496

而在 多行字符串 中, 由于使用 3 个 " 来进行定义, 因此可以在内部包含 ' (单引号)或者 " (双引号), 而无需使用 \ 进行转义.

1
2
3
4
let threeDoubleQuotationMarks = """
Escaping the first quotation mark \"""
Escaping all three quotation marks \"\"\"
"""

字符串分隔符

有时候我们的字符串中包含有特殊字符, 比如 \n, 但是我们不想出发他的 换行 效果.

此时可以将字符串放在 分隔符 中, 比如: #"Line 1\nLine 2"#, 此时如果我们打印字符串, 就不会触发 \n 的换行效果了. 如果你需要换行效果, 以上面的字符串为例可以用 #"Line 1\#nLine 2"# 来代替. 类似的 ###"Line1\###nLine2"### 也会进行换行.

分隔符还可以与多行字符串一起使用:

1
2
3
let threeMoreDoubleQuotationMarks = #"""
Here are three more double quotes: """
"""#

此处就屏蔽了中间的 """, 使字符串中包含了 """.

初始化空字符串

初始化方法有 2 种:

1
2
var emptyString = ""               // 空字符串
var anotherEmptyString = String()  // 初始化方法

检测一个字符串是否为空字符串, 可以使用 isEmpty:

1
2
3
4
if emptyString.isEmpty {
    print("是空字符串")
}
// 打印结果: 是空字符串

字符串的可变性

当我们把一个字符串赋值给 变量 的时候, 就可以对 变量字符串 进行操作 (可变字符串), 如果是 常量, 则无法进行操作 (不可变字符串):

1
2
3
4
5
6
7
var variableString = "Horse"
variableString += " and carriage"
// variableString = "Horse and carriage"

let constantString = "Highlander"
constantString += " and another Highlander"
// 报错: - a constant string cannot be modified

提示 此处与 OCCocoa 中的 NSStringNSMutableString 不同, 在 OC 中是用过使用不同的类使其成为 可变字符串不可变字符串.

String 是 值类型

SwiftString 是一个 值类型. 如果你把一个 String 对象传递给 函数 或者 方法, 或者赋值给别的 常量 或者 变量 时, String 对象将会创建一个新的字符串来进行传递, 而不是原始的 String 对象.

Swiftcopy-by-default 的特性确保了 String 对象在传递过程中, 确保 方法 或者 函数 接收到的字符串不会被修改.

Swift 编译器也对字符串进行了优化, 只有在必要的时候才会对字符串进行复制. 因此字符串在作为值类型的同时, 也保持着较好的性能.

字符

我们可以用过 for-in 循环来遍历获得字符串中的每一个字符:

1
2
3
4
5
6
7
for character in "Dog!" {
    print(character)
}
// D
// o
// g
// !

你也可以通过 单字符字符串 创建 Character 类型的 变量 或者 常量:

1
let exclamationMark: Character = "!"
本文由作者按照 CC BY 4.0 进行授权