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
提示 此处与 OC 和 Cocoa 中的
NSString
和NSMutableString
不同, 在 OC 中是用过使用不同的类使其成为 可变字符串 或 不可变字符串.
String 是 值类型
Swift 中 String
是一个 值类型. 如果你把一个 String
对象传递给 函数 或者 方法, 或者赋值给别的 常量 或者 变量 时, String
对象将会创建一个新的字符串来进行传递, 而不是原始的 String
对象.
Swift 的 copy-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 = "!"