字元串和字元
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?"