字符串字面量
字符串字面量可以用于為常量和變量提供初始值:
let someString = "Some string literal value"
注意someString常量通過(guò)字符串字面量進(jìn)行初始化,Swift 會(huì)推斷該常量為String類型淘讥。
- 多行字符串字面量
由一對(duì)三個(gè)雙引號(hào)包裹著的具有固定順序的文本字符集:
let welcomeMessgae = """
如果你需要一個(gè)字符串是跨越多行的邢笙,
那就使用多行字符串字面量
由一對(duì)三個(gè)雙引號(hào)包裹著的具有固定順序的文本字符集
"""
一個(gè)多行字符串字面量包含了所有的在開(kāi)啟和關(guān)閉引號(hào)(""")中的行轻局。這個(gè)字符從開(kāi)啟引號(hào)(""")之后的第一行開(kāi)始迹蛤,到關(guān)閉引號(hào)(""")之前為止。這就意味著字符串開(kāi)啟引號(hào)之后(""")或者結(jié)束引號(hào)(""")之前都沒(méi)有換行符號(hào)败去。(譯者:下面兩個(gè)字符串其實(shí)是一樣的篮幢,雖然第二個(gè)使用了多行字符串的形式)
let singleLineString = "These are the same."
let multilineString = """
These are the same.
"""
如果你的代碼中,多行字符串字面量包含換行符的話为迈,則多行字符串字面量中也會(huì)包含換行符三椿。如果你想換行,以便加強(qiáng)代碼的可讀性葫辐,但是你又不想在你的多行字符串字面量中出現(xiàn)換行符的話搜锰,你可以用在行尾寫(xiě)一個(gè)反斜杠()作為續(xù)行符。
let welcomeMessgae = """
如果你需要一個(gè)字符串是跨越多行的耿战,\
那就使用多行字符串字面量
由一對(duì)三個(gè)雙引號(hào)包裹著的\
具有固定順序的文本字符集
"""
為了讓一個(gè)多行字符串字面量開(kāi)始和結(jié)束于換行符蛋叼,請(qǐng)將換行寫(xiě)在第一行和最后一行,例如:
let welcomeMessgae = """
如果你需要一個(gè)字符串是跨越多行的剂陡,\
那就使用多行字符串字面量
由一對(duì)三個(gè)雙引號(hào)包裹著的具有固定順序的文本字符集
"""
一個(gè)多行字符串字面量能夠縮進(jìn)來(lái)匹配周?chē)拇a狈涮。關(guān)閉引號(hào)("""
)之前的空白字符串告訴Swift編譯器其他各行多少空白字符串需要忽略。然而鸭栖,如果你在某行的前面寫(xiě)的空白字符串超出了關(guān)閉引號(hào)("""
)之前的空白字符串歌馍,則超出部分將被包含在多行字符串字面量中。
在上面的例子中晕鹊,盡管整個(gè)多行字符串字面量都是縮進(jìn)的(源代碼縮進(jìn))松却,第一行和最后一行沒(méi)有以空白字符串開(kāi)始(實(shí)際的變量值)。中間一行的縮進(jìn)用空白字符串(源代碼縮進(jìn))比關(guān)閉引號(hào)("""
)之前的空白字符串多溅话,所以晓锻,它的行首將有4個(gè)空格。
字符串字面量的特殊字符
字符串字面量可以包含以下特殊字符:轉(zhuǎn)義字符\0(空字符)飞几、\(反斜線)砚哆、\t(水平制表符)、\n(換行符)屑墨、\r(回車(chē)符)躁锁、"(雙引號(hào))、'(單引號(hào))绪钥。
Unicode 標(biāo)量灿里,寫(xiě)成\u{n}(u為小寫(xiě)),其中n為任意一到八位十六進(jìn)制數(shù)且可用的 Unicode 位碼程腹。
下面的代碼為各種特殊字符的使用示例匣吊。 wiseWords常量包含了兩個(gè)雙引號(hào)。 dollarSign、blackHeart和sparklingHeart常量演示了三種不同格式的 Unicode 標(biāo)量:
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imageination is more important than knowledge" - Enistein
let dollarSign = "\u{24}" // $, Unicode 標(biāo)量 U+0024
let blackHeart = "\u{2665}" // ?, Unicode 標(biāo)量 U+2665
let sparklingHeart = "\u{1F496}" // ??, Unicode 標(biāo)量 U+1F496
由于多行字符串字面量使用了三個(gè)雙引號(hào)色鸳,而不是一個(gè)社痛,所以你可以在多行字符串字面量里直接使用雙引號(hào)(")而不必加上轉(zhuǎn)義符(\)。要在多行字符串字面量中使用 """ 的話命雀,就需要使用至少一個(gè)轉(zhuǎn)義符(\):
let threeDoubleQuotes = """
Escaping the first quote \"""
Escaping all three quotes \"\"\"
"""
初始化空字符串
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
// 兩個(gè)字符串均為空并等價(jià)蒜哀。
您可以通過(guò)檢查其Bool類型的isEmpty屬性來(lái)判斷該字符串是否為空:
if emptyString.isEmpty {
print("Nothing to see here")
}
// 打印輸出:"Nothing to see here"
字符串可變性
您可以通過(guò)將一個(gè)特定字符串分配給一個(gè)變量來(lái)對(duì)其進(jìn)行修改,或者分配給一個(gè)常量來(lái)保證其不會(huì)被修改:
var variableString = "Horse"
variableString += " and carriage"
// variableString 現(xiàn)在為 "Horse and carriage"
let constantString = "Highlander"
constantString += " and another Highlander"
// 這會(huì)報(bào)告一個(gè)編譯錯(cuò)誤 (compile-time error) - 常量字符串不可以被修改吏砂。
字符串是值類型
Swift 的String類型是值類型撵儿。 如果您創(chuàng)建了一個(gè)新的字符串,那么當(dāng)其進(jìn)行常量狐血、變量賦值操作淀歇,或在函數(shù)/方法中傳遞時(shí),會(huì)進(jìn)行值拷貝匈织。 任何情況下浪默,都會(huì)對(duì)已有字符串值創(chuàng)建新副本,并對(duì)該新副本進(jìn)行傳遞或賦值操作缀匕。
Swift 默認(rèn)字符串拷貝的方式保證了在函數(shù)/方法中傳遞的是字符串的值纳决。 很明顯無(wú)論該值來(lái)自于哪里,都是您獨(dú)自擁有的乡小。 您可以確信傳遞的字符串不會(huì)被修改阔加,除非你自己去修改它。
在實(shí)際編譯時(shí)劲件,Swift 編譯器會(huì)優(yōu)化字符串的使用掸哑,使實(shí)際的復(fù)制只發(fā)生在絕對(duì)必要的情況下约急,這意味著您將字符串作為值類型的同時(shí)可以獲得極高的性能零远。