字符串和字符
String 是一个有序的字符集合,例如 "hello, world", "albatross"。Swift 字符串通过 String 类型来表示,也可以表示为 Character 类型值的集合。
Swift 的 String 和 Character 类型提供了一个快速的,兼容 Unicode 的方式来处理代码中的文本信息。创建和操作字符串的语法与 C 的操作方式相似,轻量并且易读。字符串连接操作只需要简单地通过 + 号将两个字符串相连即可。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。
String 也可以用来在长字符串中插入常量、变量、字面量和表达式,这一过程称为字符串插值。这使得创建用于展示、存储和打印的自定义字符串变得轻松自如。
字符串字面量
您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号包裹着的具有固定顺序的文本字符。
字符串字面量可以用于为常量和变量提供初始值。
1. let someString = "Some string literal value"
注意:someString 常量通过字符串字面量进行初始化,Swift 因此推断其为 String 类型。
字符串字面量可以包含以下特殊字符:
1.转义特殊字符 \0 (空字符)、\\(反斜线)、\t (水平制表符)、\n (换行符)、\r (回车符)、\" (双
引号)、\' (单引号)。
2.单字节 Unicode 标量,写成 \xnn,其中 nn 为两位十六进制数。
3.双字节 Unicode 标量,写成 \unnnn,其中 nnnn 为四位十六进制数。
4.四字节 Unicode 标量,写成 \Unnnnnnnn,其中 nnnnnnnn 为八位十六进制数。
初始化空字符串
为了构造一个很长的字符串,可以创建一个空字符串作为初始值。可以将空的字符串字面量赋值给变量,也可以初始化一个新的 String 实例:
1. var emptyString = "" // empty string literal
2. var anotherEmptyString = String() // initializer syntax
3. // 这两个字符串都为空,并且两者等价
您可以通过检查其 Boolean 类型的 isEmpty 属性来判断该字符串是否为空:
1. if emptyString.isEmpty {
2. println("Nothing to see here")
3. }
4. // 打印 "Nothing to see here"
字符串可变性
您可以通过将一个特定字符串分配给一个变量(对其进行修改)或者常量(保证其不会被修改)来指定该字符串是否可以被修改:
1. var variableString = "Horse"
2. variableString += " and carriage"
3. // variableString 现在为 "Horse and carriage"
4. let constantString = "Highlander"
5. constantString += " and another Highlander"
6. // 这会报告一个编译错误(compile-time error) - 常量不可以被修改。
注意:在 Objective-C 和 Cocoa 中,您通过选择两个不同的类( NSString 和 NSMutableString )来指定该字符串是否可以被修改,Swift 中的字符串是否可以修改仅通过定义的是变量还是常量来决定,实现了多种类型可变性操作的统一。
使用字符(Characters)
Swift 的 String 类型表示特定序列的字符值的集合。每一个字符值代表一个 Unicode 字符。您可利用 for-in 循环来遍历字符串中的每一个字符:
1. for character in "Dog!????" {
2. println(character)
3. }
4. // D
5. // o
6. // g
7. // !
8. // ????
另外,通过标明一个 Character 类型注解并通过字符字面量进行赋值,可以建立一个独立的字符常量或变量:
1. let yenSign: Character = "¥"
计算字符数量
通过调用全局 countElements 函数,并将字符串作为参数进行传递可以获取该字符串的字符数量。
1. let unusualMenagerie = "Koala ????, Snail ????, Penguin ????, Dromedar
y ????"
2. println("unusualMenagerie has \(countElements(unusualMenagerie)) chara
cters")
3. // prints "unusualMenagerie has 40 characters"
字符串插值
字符串插值是一种全新的构建字符串的方式,可以在其中包含常量、变量、字面量和表达式。
您插入的字符串字面量的每一项都被包裹在以反斜线为前缀的圆括号中:
1. let multiplier = 3
2. let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
3. // message is "3 times 2.5 is 7.5"
在上面的例子中,multiplier 作为 \(multiplier) 被插入到一个字符串字面量中。当创建字符串执行插值计算时此占位符会被替换为 multiplier 实际的值。
multiplier 的值也作为字符串中后面表达式的一部分。该表达式计算 Double(multiplier) * 2.5 的值并将结果 (7.5) 插入到字符串中。在这个例子中,表达式写为 \(Double(multiplier) * 2.5) 并包含在字符串字面量中。
注意:您插值字符串中写在括号中的表达式不能包含非转义双引号 (") 和反斜杠 (\),并且不能包含回车或换行符。
比较字符串
Swift 提供了三种方式来比较字符串的值:字符串相等,前缀相等和后缀相等。
*字符串相等
如果两个字符串以同一顺序包含完全相同的字符,则认为两者字符串相等:
1. let quotation = "We're a lot alike, you and I."
2. let sameQuotation = "We're a lot alike, you and I."
3. if quotation == sameQuotation {
4. println("These two strings are considered equal")
5. }
6. // prints "These two strings are considered equal"
*前缀/后缀相等
通过调用字符串的 hasPrefix/hasSuffix 方法来检查字符串是否拥有特定前缀/后缀。两个方法均需要以字符串作为参数传入并返回 Boolean 值。两个方法均执行基本字符串和前缀/后缀字符串之间逐个字符的比较操作。
下面的例子以一个字符串数组表示莎士比亚话剧《罗密欧与朱丽叶》中前两场的场景位置:
1. let romeoAndJuliet = [
2. "Act 1 Scene 1: Verona, A public place",
3. "Act 1 Scene 2: Capulet's mansion",
4. "Act 1 Scene 3: A room in Capulet's mansion",
5. "Act 1 Scene 4: A street outside Capulet's mansion",
6. "Act 1 Scene 5: The Great Hall in Capulet's mansion",
7. "Act 2 Scene 1: Outside Capulet's mansion",
8. "Act 2 Scene 2: Capulet's orchard",
9. "Act 2 Scene 3: Outside Friar Lawrence's cell",
10. "Act 2 Scene 4: A street in Verona",
11. "Act 2 Scene 5: Capulet's mansion",
12. "Act 2 Scene 6: Friar Lawrence's cell"
13. ]
您可以利用 hasPrefix 方法使用 romeoAndJuliet 数组来计算话剧中第一幕的场景数:
1. var act1SceneCount = 0
2. for scene in romeoAndJuliet {
3. if scene.hasPrefix("Act 1 ") {
4. ++act1SceneCount
5. }
6. }
7. println("There are \(act1SceneCount) scenes in Act 1")
8. // prints "There are 5 scenes in Act 1"
同样,可使用 hasSuffix方法来计算发生在 Capulet 公馆和 Lawrence 牢房内以及周围的场景数。
1. var mansionCount = 0
2. var cellCount = 0
3. for scene in romeoAndJuliet {
4. if scene.hasSuffix("Capulet's mansion") {
5. ++mansionCount
6. } else if scene.hasSuffix("Friar Lawrence's cell") {
7. ++cellCount
8. }
9. }
10. println("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
11. // prints "6 mansion scenes; 2 cell scenes"
大写和小写字符串
您可以通过字符串的 uppercaseString 和 lowercaseString 属性来访问一个字符串的大写/小写版本。
1. let normal = "Could you help me, please?"
2. let shouty = normal.uppercaseString
3. // shouty 值为 "COULD YOU HELP ME, PLEASE?"
4. let whispered = normal.lowercaseString
5. // whispered 值为 "could you help me, please?"