字符串和字符
本节内容包括:
<a name = "字符串字面量"></a>字符串字面量
字符串字面量是由双引号 ("") 包裹着的具有固定顺序的文本字符集。
let someString = "Some string literal value"
字符串字面量可以包含以下特殊字符:
- 转义字符
\0
(空字符)、\\
(反斜线)、\t
(水平制表符)、\n
(换行符)、\r
(回车符)、\"
(双引号)、\'
(单引号)。 - Unicode 标量,写成
\u{n}
(u为小写),其中n
为任意的一到八位十六进制数。
<a name = "初始化空字符串"></a>初始化空字符串
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化 String 实例
<a name = "字符串可变性"></a>字符串可变性
在 Objective-C 和 Cocoa 中,您通过选择两个不同的类(NSString和NSMutableString)来指定该字符串是否可以被修改,Swift 中的字符串是否可以修改仅通过定义的是变量还是常量来决定,实现了多种类型可变性操作的统一。
<a name = "字符串的值类型"></a>字符串的值类型
Swift 的String类型是值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作或在函数/方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。
注意
与 Cocoa 中的NSString不同,当您在 Cocoa 中创建了一个NSString实例,并将其传递给一个函数/方法,或者赋值给一个变量,您传递或赋值的是该NSString实例的一个引用,除非您特别要求进行值拷贝,否则字符串不会生成新的副本来进行赋值操作。
在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能。
<a name = "使用字符"></a>使用字符
Swift 的String类型表示特定序列的Character(字符) 类型值的集合。 每一个字符值代表一个 Unicode 字符。 您可利用for-in循环来遍历字符串中的每一个字符:
for character in "Dog!🐶" {
println(character)
}
<a name = "计算字符数量"></a>计算字符数量
通过调用全局count(_:)
函数,并将字符串作为参数进行传递,可以获取该字符串的字符数量。
注意:
不同的 Unicode
字符以及相同 Unicode
字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift
中的字符在一个字符串中并不一定占用相同的内存空间。因此字符串的长度不得不通过迭代字符串中每一个字符的长度来进行计算。如果您正在处理一个长字符串,需要注意countElements
函数必须遍历字符串中的字符以精准计算字符串的长度。 另外需要注意的是通过countElements
返回的字符数量并不总是与包含相同字符的NSString
的length
属性相同。NSString
的length
属性是基于利用 UTF-16
表示的十六位代码单元数字,而不是基于 Unicode
字符。为了解决这个问题,NSString
的length
属性在被 Swift
的String
访问时会成为utf16count
。
<a name = "连接字符串和字符"></a>连接字符串和字符
- 字符串可以通过加法运算符(
+
)相加在一起 - 加法赋值运算符 (
+=
) 将一个字符串添加到一个已经存在字符串变量上 - 可以用将
append
方法将一个字符附加到一个字符串变量的尾部
<a name = "字符串插值"></a>字符串插值
字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量的每一项都被包裹在以反斜线为前缀的圆括号中:
let multiplier = 3
let message = "\(multiplier) 乘以 2.5 是 \(Double(multiplier) * 2.5)"
// message 是 "3 乘以 2.5 是 7.5"
注意:
插值字符串中写在括号中的表达式不能包含非转义双引号 (") 和反斜杠 (),并且不能包含回车或换行符。
<a name = "比较字符串"></a>比较字符串
字符串相等
如果两个字符串以同一顺序包含完全相同的字符,则认为两者字符串相等:
前缀/后缀相等
通过调用字符串的hasPrefix/hasSuffix
方法来检查字符串是否拥有特定前缀/后缀。 两个方法均需要以字符串作为参数传入并传出Boolean值。 两个方法均执行基本字符串和前缀/后缀字符串之间逐个字符的比较操作。
<a name = "字符串大小写"></a>字符串大小写
您可以通过字符串的uppercaseString
和lowercaseString
属性来访问大写/小写版本的字符串。
<a name = "Unicode"></a> Unicode
- UTF-8 代码单元集合 (利用字符串的
utf8
属性进行访问) - UTF-16 代码单元集合 (利用字符串的
utf16
属性进行访问) - 21位的 Unicode 标量值集合 (利用字符串的
unicodeScalars
属性进行访问)