字符串字面量
您可以在您的代碼中包含一段預(yù)定義的字符串值作為字符串字面量谦炒。字符串字面量是由雙引號""
包裹著的具有固定順序的文本字符集碴开。 字符串字面量可以用于為常量和變量提供初始值:
let someString = "Some string literal value"
someString
常量通過字符串字面量進(jìn)行初始化故硅,Swift
會推斷該常量為String
類型针余。
初始化空字符串
要創(chuàng)建一個空字符串作為初始值芯急,可以將空的字符串字面量賦值給變量豌蟋,也可以初始化一個新的String
實例:
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
判斷該字符串是否為空:
print(emptyString.isEmpty) // true
字符串可變性
您可以通過將一個特定字符串分配給一個變量來對其進(jìn)行修改速和,或者分配給一個常量來保證其不會被修改
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ū)別中進(jìn)行了詳細(xì)描述县钥。
public struct String {
...
}
如果您創(chuàng)建了一個新的字符串,那么當(dāng)其進(jìn)行常量慈迈、變量賦值操作若贮,或在函數(shù)、方法中傳遞時痒留,會進(jìn)行值拷貝谴麦。 任何情況下,都會對已有字符串值創(chuàng)建新副本伸头,并對該新副本進(jìn)行傳遞或賦值操作匾效。
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)建新字符串的方式恤磷,可以在其中包含常量面哼、變量野宜、字面量和表達(dá)式。 您插入的字符串字面量的每一項都在以反斜線為前綴的圓括號中:
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5"
注意:
插值字符串中寫在括號中的表達(dá)式不能包含非轉(zhuǎn)義反斜杠\
魔策,并且不能包含回車或換行符匈子。不過,插值字符串可以包含其他字面量闯袒。
Unicode
Unicode
是一個國際標(biāo)準(zhǔn)虎敦,用于文本的編碼和表示。 它使您可以用標(biāo)準(zhǔn)格式表示來自任意語言幾乎所有的字符政敢,并能夠?qū)ξ谋疚募蚓W(wǎng)頁這樣的外部資源中的字符進(jìn)行讀寫操作其徙。Swift
的String
和Character
類型是完全兼容Unicode
標(biāo)準(zhǔn)的。
Unicode 標(biāo)量
Swift
的String
類型是基于Unicode
標(biāo)量建立的喷户。Unicode
標(biāo)量是對應(yīng)字符或者修飾符的唯一的21
位數(shù)字唾那,注意不是所有的21
位Unicode
標(biāo)量都代表一個字符,因為有一些標(biāo)量是留作未來分配的褪尝。
字符串字面量的特殊字符
字符串字面量可以包含以下特殊字符:
- 轉(zhuǎn)義字符
空字符\0
通贞、反斜線\\
、水平制表符\t
恼五、換行符\n
昌罩、回車符\r
、雙引號\"
灾馒、單引號\'
茎用。 -
Unicode
標(biāo)量
寫成\u{n}
(u
為小寫),其中n
為任意一到八位十六進(jìn)制數(shù)且可用的Unicode
位碼睬罗。
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
訪問字符串
每一個String
值都有一個關(guān)聯(lián)的索引index
類型轨功,String.Index
它對應(yīng)著字符串中的每一個Character
的位置。
- 第一個索引
let string = "hello world" let start = string.startIndex // String.Index 類型 string[start] // 結(jié)果 h
- 最后一個索引
使用endIndex
屬性可以獲取最后一個Character
的后一個位置的索引容达。因此古涧,endIndex
屬性不能作為一個字符串的有效下標(biāo)。string[string.endIndex] // 越界錯誤 string.index(after: endIndex) // 越界錯誤
- 索引
通過上一個索引和下一個索引獲取對應(yīng)索引:
通過偏移量獲取對應(yīng)的索引:string[string.index(after: string.startIndex)] // 第二個 e string[string.index(before: string.endIndex)] // 最后一個字符 d
let 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"]