字符字面量(String Literals)
多行字面量
使用 """ 包圍字符串
let quotation = """
The White Rabbit put on his spectacles. "Where shall I begin,
please your Majesty?" he asked.
"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""
特殊字符
\0 null
\\ 反斜杠
\t 水平制表符
\n 換行符
\r 回車符
'\n' is the default in Unix, '\r\n' is the default in Windows.
\" 雙引號
\' 單引號
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\u{24}" // $, Unicode scalar U+0024
let blackHeart = "\u{2665}" // ?, Unicode scalar U+2665
let sparklingHeart = "\u{1F496}" // ??, Unicode scalar U+1F496
string 是值類型( copy-by-default)
所謂值類型是值,當(dāng)賦值給另一個變量是,它的值被拷貝給另一個變量.
Swift的編譯器優(yōu)化了字符串的使用,只有在必須的時候?qū)嶋H的復(fù)制才會發(fā)生.
Character
訪問 string里的 character
for character in "Dog!??" {
print(character)
}
// D
// o
// g
// !
// ??
連接String和Character
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome now equals "hello there"
var instruction = "look over"
instruction += string2
// instruction now equals "look over there"
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome now equals "hello there!"
多行字符連接
let badStart = """
one
two
"""
let end = """
three
"""
print(badStart + end)
// Prints two lines:
// one
// twothree
let goodStart = """
one
two
"""
print(goodStart + end)
// Prints three lines:
// one
// two
// three
字符串插值
構(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"
Unicode
是一個國際標(biāo)準(zhǔn),用于文本的編碼和表示。
Unicode 標(biāo)量
Swift 的String類型是基于 Unicode 標(biāo)量 建立的。 Unicode 標(biāo)量是對應(yīng)字符或者修飾符的唯一的21位數(shù)字,例如U+0061表示小寫的拉丁字母(LATIN SMALL LETTER A)("a"),U+1F425表示小雞表情(FRONT-FACING BABY CHICK) ("??")。
注意: Unicode 碼位(code poing) 的范圍是U+0000到U+D7FF或者U+E000到U+10FFFF。Unicode 標(biāo)量不包括 Unicode 代理項(xiàng)(surrogate pair) 碼位,其碼位范圍是U+D800到U+DFFF
可擴(kuò)展的字形群集
每一個 Swift 的Character類型代表一個可擴(kuò)展的字形群。 一個可擴(kuò)展的字形群是一個或多個可生成人類可讀的字符 Unicode 標(biāo)量的有序排列。
每一個 Swift 的Character類型代表一個可擴(kuò)展的字形群。 一個可擴(kuò)展的字形群是一個或多個可生成人類可讀的字符 Unicode 標(biāo)量的有序排列。
舉個例子,字母é可以用單一的 Unicode 標(biāo)量é(LATIN SMALL LETTER E WITH ACUTE, 或者U+00E9)來表示。然而一個標(biāo)準(zhǔn)的字母e(LATIN SMALL LETTER E或者U+0065) 加上一個急促重音(COMBINING ACTUE ACCENT)的標(biāo)量(U+0301),這樣一對標(biāo)量就表示了同樣的字母é。 這個急促重音的標(biāo)量形象的將e轉(zhuǎn)換成了é。
在這兩種情況中,字母é代表了一個單一的 Swift 的Character值,同時代表了一個可擴(kuò)展的字形群。 在第一種情況,這個字形群包含一個單一標(biāo)量;而在第二種情況,它是包含兩個標(biāo)量的字形群:
let eAcute: Character = "\u{E9}" // é
let combinedEAcute: Character = "\u{65}\u{301}" // e 后面加上 ?
// eAcute 是 é, combinedEAcute 是 é
計算字符數(shù)量
let unusualMenagerie = "Koala ??, Snail ??, Penguin ??, Dromedary ??"
print("unusualMenagerie has \(unusualMenagerie.count) characters")
// Prints "unusualMenagerie has 40 characters"
注意在 Swift 中,使用可拓展的字符群集作為Character值來連接或改變字符串時,并不一定會更改字符串的字符數(shù)量。
例如,如果你用四個字符的單詞cafe初始化一個新的字符串,然后添加一個COMBINING ACTUE ACCENT(U+0301)作為字符串的結(jié)尾。最終這個字符串的字符數(shù)量仍然是4,因?yàn)榈谒膫€字符是é,而不是e:
var word = "cafe"
print("the number of characters in \(word) is \(word.count)")
// Prints "the number of characters in cafe is 4"
word += "\u{301}" // COMBINING ACUTE ACCENT, U+0301
print("the number of characters in \(word) is \(word.count)")
// Prints "the number of characters in café is 4"
訪問和修改字符串
可以通過方法,屬性,下標(biāo)語法
字符串索引
每一個String值都有一個關(guān)聯(lián)的索引(index)類型,String.Index,它對應(yīng)著字符串中的每一個Character的位置。
由于不同的字符可能占用不同數(shù)量的內(nèi)存空間,所以要確定character的位置,就必須從string開頭遍歷每一個Unicode標(biāo)量知道結(jié)尾,因此,Swift 的字符串不能用整數(shù)(integer)做索引。
使用startIndex屬性可以獲取一個String的第一個Character的索引。使用endIndex屬性可以獲取最后一個Character的后一個位置的索引。因此,endIndex屬性不能作為一個字符串的有效下標(biāo)。如果String是空串,startIndex和endIndex是相等的。
通過調(diào)用 String 的 index(before:) 或 index(after:) 方法,可以立即得到前面或后面的一個索引。您還可以通過調(diào)用 index(_:offsetBy:) 方法來獲取對應(yīng)偏移量的索引,這種方式可以避免多次調(diào)用 index(before:) 或 index(after:) 方法。
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
使用indices 屬性會創(chuàng)建一個包含全部索引的范圍(Range),用來在一個字符串中訪問單個字符。
for index in greeting.indices {
print("\(greeting[index]) ", terminator: "")
}
// 打印輸出 "G u t e n T a g ! "
插入和移除
插入單個字符 和 字符串
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"
welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"
移除單個字符 和 字符串
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"
Substrings
當(dāng)你從一個string得到一個substring --例如 使用subscript或者方法prefix(_:). Substrings與strings有大部分相同的方法.
但是你需要使用substring的時間一般很短.當(dāng)你需要長期保持結(jié)果時,你可以把substring轉(zhuǎn)成string
let greeting = "Hello, world!"
let index = greeting.index(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"
// Convert the result to a String for long-term storage.
let newString = String(beginning)
出于性能的考慮,substring會重用原始字符串的部分存儲。
字符比較
String 和 Character 的相等
比較相等使用 "=="
不相等 "!="
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"
兩個字符串被認(rèn)為是相等的如果他們可擴(kuò)展的字形群集(extended grapheme clusters)是相同的
前綴/后綴相等
通過調(diào)用字符串的hasPrefix(:)/hasSuffix(:)方法來檢查字符串是否擁有特定前綴/后綴,兩個方法均接收一個String類型的參數(shù),并返回一個布爾值
字符串的 Unicode 表示形式
當(dāng)一個 Unicode 字符串被寫進(jìn)文本文件或者其他儲存時,字符串中的 Unicode 標(biāo)量會用 Unicode 定義的幾種編碼格式(encoding forms)編碼。每一個字符串中的小塊編碼都被稱代碼單元(code units)。這些包括 UTF-8 編碼格式(編碼字符串為8位的代碼單元), UTF-16 編碼格式(編碼字符串位16位的代碼單元),以及 UTF-32 編碼格式(編碼字符串32位的代碼單元)。
Swift 提供了幾種不同的方式來訪問字符串的Unicode表示形式.您可以利用for-in來對字符串進(jìn)行遍歷,從而以Unicode可擴(kuò)展的字符群集的方式訪問每一個character值.
另外,能夠以其他三種Unicode兼容的方式訪問字符串的值
- UTF-8代碼單元集合(利用字符串的utf8屬性來進(jìn)行訪問)
- UTF-16代碼單元集合(利用字符串的utf16屬性來進(jìn)行訪問)
- 21位的Unicode標(biāo)量值,也及時字符串的UTF-32編碼格式(利用字符串的unicodeScalars屬性進(jìn)行訪問)
下面由D,o,g,?(DOUBLE EXCLAMATION MARK, Unicode 標(biāo)量 U+203C)和??(DOG FACE,Unicode 標(biāo)量為U+1F436)組成的字符串中的每一個字符代表著一種不同的表示:
let dogString = "Dog!!??"
UTF-8表示
你可以通過遍歷String的utf8屬性來訪問它的UTF-8表示。 其為String.UTF8View類型的屬性,UTF8View是無符號8位 (UInt8) 值的集合,每一個UInt8值都是一個字符的 UTF-8 表示:
for codeUnit in dogString.utf8 {
print("\(codeUnit) ", terminator: "")
}
print("")
// Prints "68 111 103 226 128 188 240 159 144 182 "
UTF-16表示
你可以通過遍歷String的utf16屬性來訪問它的UTF-16表示.
其為String.UTF16View類型的屬性,UTF16View是無符號16位(UInt16)
值得集合,每一個UInt16值都是一個字符的UTF-16表示:
for codeUnit in dogString.utf16 {
print("\(codeUnit) ", terminator: "")
}
print("")
// Prints "68 111 103 8252 55357 56374 "
Unicode 標(biāo)量表示
您可以通過遍歷String值的unicodeScalars屬性來訪問它的 Unicode 標(biāo)量表示。 其為UnicodeScalarView類型的屬性,UnicodeScalarView是UnicodeScalar類型的值的集合。 UnicodeScalar是21位的 Unicode 代碼點(diǎn)。
每一個UnicodeScalar擁有一個value屬性,可以返回對應(yīng)的21位數(shù)值,用UInt32來表示:
for scalar in dogString.unicodeScalars {
print("\(scalar.value) ", terminator: "")
}
print("")
// Prints "68 111 103 8252 128054 "