字符串字面量
您可以在您的代碼中包含一段預定義的字符串值作為字符串字面量。字符串字面量是由雙引號""包裹著的具有固定順序的文本字符集。 字符串字面量可以用于為常量和變量提供初始值:
let someString = "Some string literal value"
someString常量通過字符串字面量進行初始化,Swift會推斷該常量為String類型。
初始化空字符串
要創(chuàng)建一個空字符串作為初始值,可以將空的字符串字面量賦值給變量,也可以初始化一個新的String實例:
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
判斷該字符串是否為空:
print(emptyString.isEmpty) // true
字符串可變性
您可以通過將一個特定字符串分配給一個變量來對其進行修改,或者分配給一個常量來保證其不會被修改
var variableString = "hello"
variableString += " world"
// variableString 現(xiàn)在為 "hello world"
let constantString = "hello"
constantString += " world"
// 這會報告一個編譯錯誤 (compile-time error) - 常量字符串不可以被修改。
字符串是值類型
String的定義就是一個結(jié)構(gòu)體,結(jié)構(gòu)體是值類型。在Swift中struct和class的區(qū)別中進行了詳細描述。
public struct String {
...
}
如果您創(chuàng)建了一個新的字符串,那么當其進行常量、變量賦值操作,或在函數(shù)、方法中傳遞時,會進行值拷貝。 任何情況下,都會對已有字符串值創(chuàng)建新副本,并對該新副本進行傳遞或賦值操作。
var str1 = "hello"
var str2 = str1
str2 = "hello world"
print("str1: "+str1+" str2: "+str2)
// str1: hello str2: hello world
字符
Swift中用characters表示字符。
for character in "Dog".characters {
print(character)
}
// D
// o
// g
字符串可以通過傳遞一個值類型為Character的數(shù)組作為自變量來初始化:
let catCharacters: [Character] = ["C", "a", "t", "!", "??"]
let catString = String(catCharacters) // "Cat!??"
還可以判斷字符串是否包含字符:
catString.contains("a") // true
獲取字符個數(shù):
catString.characters.count // 5
連接字符串和字符
通過加法運算符+連接在一起創(chuàng)建一個新的字符串:
let string1 = "hello"
let string2 = " world"
let welcome = string1 + string2 // welcome 現(xiàn)在等于 "hello world"
通過加法賦值運算符+=將一個字符串添加到一個已經(jīng)存在字符串變量上:
var string = "hello"
string += " world" // string 現(xiàn)在等于 "hello world"
用append()方法將一個字符附加到一個字符串變量的尾部:
var string = "hello world"
let ch: Character = "!"
string.append(ch) // string 現(xiàn)在等于 "hello world!"
string.append("...") // string 現(xiàn)在等于 "hello world!..."
字符串插值
字符串插值是一種構(gòu)建新字符串的方式,可以在其中包含常量、變量、字面量和表達式。 您插入的字符串字面量的每一項都在以反斜線為前綴的圓括號中:
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5"
注意:
插值字符串中寫在括號中的表達式不能包含非轉(zhuǎn)義反斜杠\,并且不能包含回車或換行符。不過,插值字符串可以包含其他字面量。
Unicode
Unicode是一個國際標準,用于文本的編碼和表示。 它使您可以用標準格式表示來自任意語言幾乎所有的字符,并能夠?qū)ξ谋疚募蚓W(wǎng)頁這樣的外部資源中的字符進行讀寫操作。Swift的String和Character類型是完全兼容Unicode標準的。
Unicode 標量
Swift的String類型是基于Unicode標量建立的。Unicode標量是對應字符或者修飾符的唯一的21位數(shù)字,注意不是所有的21位Unicode標量都代表一個字符,因為有一些標量是留作未來分配的。
字符串字面量的特殊字符
字符串字面量可以包含以下特殊字符:
- 轉(zhuǎn)義字符
空字符\0、反斜線\\、水平制表符\t、換行符\n、回車符\r、雙引號\"、單引號\'。 -
Unicode標量
寫成\u{n}(u為小寫),其中n為任意一到八位十六進制數(shù)且可用的Unicode位碼。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imageination is more important than knowledge" - Enistein
let dollarSign = "\u{24}" // $, Unicode 標量 U+0024
let blackHeart = "\u{2665}" // ?, Unicode 標量 U+2665
let sparklingHeart = "\u{1F496}" // ??, Unicode 標量 U+1F496
訪問字符串
每一個String值都有一個關(guān)聯(lián)的索引index類型,String.Index它對應著字符串中的每一個Character的位置。
- 第一個索引
let string = "hello world" let start = string.startIndex // String.Index 類型 string[start] // 結(jié)果 h - 最后一個索引
使用endIndex屬性可以獲取最后一個Character的后一個位置的索引。因此,endIndex屬性不能作為一個字符串的有效下標。string[string.endIndex] // 越界錯誤 string.index(after: endIndex) // 越界錯誤 - 索引
通過上一個索引和下一個索引獲取對應索引:
通過偏移量獲取對應的索引:string[string.index(after: string.startIndex)] // 第二個 e string[string.index(before: string.endIndex)] // 最后一個字符 dlet index = string.index(string.startIndex, offsetBy: 4) string[index] // o - 根據(jù)字符獲取索引
let index = string.index(of: "w")
修改字符串
插入
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 變量現(xiàn)在等于 "hello!"
welcome.insert(contentsOf:" world".characters, at: welcome.index(before: welcome.endIndex))
// welcome 變量現(xiàn)在等于 "hello world!"
刪除
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 現(xiàn)在等于 "hello world"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 現(xiàn)在等于 "hello"
替換
var welcome = "hello world"
let range = welcome.index(welcome.startIndex, offsetBy: 6)..< welcome.endIndex
welcome.replaceSubrange(range, with: "Swift")
// welcome 現(xiàn)在等于 "hello Swift"
前綴、后綴相等
let string = "hello world"
string.hasPrefix("a") // false
string.hasSuffix("d") // true
大小寫切換
string.lowercased()
string.uppercased()
字符串轉(zhuǎn)數(shù)組
let string = "a,b,c,d"
string.components(separatedBy: ",") // ["a", "b", "c", "d"]