標籤:文字檔 獨立 字元集 可擴充 aaa 固定 順序 hello 字元
// 字串 和 字元
// 字串 是有序的 Character (字元) 類型的值的集合, 通過 String 類型的集合
// swift 的 String 和 Character 類型提供了快速和相容 Unicode 的方式供你的代碼使用, 建立和操作字串的文法與C語言中的字串相似, 輕量並且已讀
// 字串串連操作只需要簡單地通過 + 符號將兩個字串串連即可
// 與swift 中其他值一樣, 能否更改字串的值, 取決於其被定義為常量還是變數
// 注意:
// swift 的 String 類型與 Foundation NSString 類進行了無縫對接, Foundation 也可以對 String 進行擴充, 暴露在 NSString 中定義的方法 , 這意味著,如果你在 String 中調用這些 NSString 的方法, 將不用進行轉換
var ss = "aaaaaaa"
let bb = ss + "bbbbbb"
print(bb)
// 字串字面量
// 字串字面量室友雙引號 ("")包裹著的具有固定順序的文本字元集
// 字串字面量可以為常量或者變數提供初始值
// 初始化Null 字元串
// 要建立一個Null 字元串作為初始值, 可以將空的字串字面量賦值給變數, 也可以初始化一個新的 String 執行個體
var emptyString = "" // Null 字元串字面量
var antherEmptyString = String() // 初始化方法
// 你可以通過檢查其 Bool 類型的 isEmpty 屬性來判斷改字串是否為空白
if emptyString.isEmpty{
print("Nothing to see here")
}
// 字串可變性
// 你可以通過講一個特定字串分配給一個變數來對其進行修改, 或者分配給一個常量保證其不會被修改
// 注意:
// Objective-C 和 Cocoa 中 , 你需要通過選擇兩個不同的類 (NSString 和 NSMutableString) 來指定字串是否可以被修改
// 使用字元
// 你可以通過 for-in 迴圈來遍曆字串中的 characters 屬性來擷取每一個字元的值;
for charcater in "Dog!??".characters {
print(charcater)
}
// 另外,通過表明一個 Character 類型並用字元字面量進行複製, 可以建立一個獨立的字元常量或變數
let exclamationMark: Character = "!"
// 字串可以通過傳遞一個實值型別為 Character 的數組作為自變數來初始化
let catCahracter: [Character] = ["C","a","t","!","??"]
let catString = String(catCahracter)
print(catString)
// 連接字串和字元
// 字串可以通過加法運算子 (+) 相加在一起(或稱串連)建立一個新的字串
let string1 = "hello"
let string2 = " world"
var welcome = string1 + string2
// 你也可以通過加法賦值運算子 (+=) 將一個字串添加到一個已經存在的字串之後
var instryction = "look over"
instryction += string2
// 你也可以用 append() 方法講一個字元添加到字串變數的尾部
let exclamationmark: Character = "!"
welcome.append(exclamationMark)
welcome.append(string2)
// 注意:你不能將一個字串或者字元添加到一個已經存在的字元變數上面,因為字元變數只能包含一個字元
// 字串插值
// 字串插值是一種構建新字串的方式, 可以再其中包含常量.變數,字面量,和運算式
// 你插入的字串字面量的每一項都在以 反斜線 為 首碼的 圓括弧 內
// 注意:
// 插值字串中寫在括弧內的運算式不能包含非轉義反斜線(\), 並且不能包含 斷行符號 或 分行符號, 不過插值字串可以包含其他字面量
// Unicode
// swift 的 string 類型是基於 Unicode 標量建立的
// Unicode 標量是對應字元或者修飾符的唯一的 21 位元字,
// 字串字面量的特殊字元
// 字串字面量可以包含以下特殊字元
// 逸出字元 : \0 (Null 字元) , \\ (反斜線) , \n (分行符號) , \r (斷行符號符)
// \" (雙引號) , \‘ (單引號) , Unicode標量, 寫成\u{n} (u 為小寫) 其中n為任意一到八位十六進位數且可用的 Unicode 位碼
// 可擴充的字形群集
// 每一個Swift 的 Character 類型代表一個可擴充的字形群, 一個可擴充的字形群是一個或多個可產生人類可讀的字元 Unicode 標量的有序排列
// 計算字元數量
// 如果想要獲得一個字串中 Character 值的數量, 可以使用字串的 character 屬性的 count 屬性
var word = "cafe"
print("the number of characters in \(word) is \(word.characters.count)")
// 列印輸出 "the number of characters in cafe is 4"
// 訪問和修改字串
// 你可以通過字串的屬性和方法來訪問和修改他, 當然也可以用下標文法完成
// 字串索引
// 每一個 string 值都有一個關聯的索引(index)類型, String.Index, 他對應著字串中的每一個 character 的位置
// 不同的字串可能會佔用不同數量的記憶體空間, 所以要知道 character 的確定位置, 就必須從 string 的開頭遍曆每一個 Unicode 標量直到結尾, 因此, Swift 的字串不能用整數(interger)做索引
// 使用 startIndex 屬性可以擷取一個 string 的第一個 character 的索引, 使用 endIndex 屬性可以擷取最後一個 character 的後一個位置的索引, 因此 endIndex 不能作為一個字串的有效下標, 如果 string 是空串, startIndex 和 endIndex 是相等的
// 通過調用 string 的 index(before:) 或 index(after:) 方法, 可以立即得到前面或者後面的一個索引, 您還可以通過調用 index(_:offsetBy:) 方法來擷取對應位移量的索引, 這種方法可以避免多次調用 index(before:) 或者 index(after:) 方法
let greenting = "Guten Tag!"
print(greenting[greenting.startIndex])
greenting[greenting.index(before: greenting.endIndex)]
greenting[greenting.index(after: greenting.startIndex)]
let index = greenting.index(greenting.startIndex, offsetBy: 7)
greenting[index]
// 使用 character 屬性的 indices 屬性會建立一個包好全部索引的範圍(Range), 用來在一個字串中訪問單個字元
for index in greenting.characters.indices {
print("\(greenting[index])")
}
// 注意 : 你可以使用startIndex 和 endIndex 屬性或者(index:before), index(after:) 和index:(_:offsetBy:) 方法在任意七個確定並遵循 collection 協議的類型裡面, 如上文所示是使用在 String 中, 您也可以使用在 array, dictionary 和 set 中
// 插入和刪除
// 調用 insert(_:at:) 方法可以在一個字串的指定索引插入一個字元, 調用 insert(contentsOf:at:) 方法可以在一個字串的指定索引插入一個段字串
var welcomeStr = "hello"
welcomeStr.insert("!", at: welcomeStr.endIndex)
welcomeStr.insert(contentsOf: " there".characters, at: welcomeStr.index(before: welcomeStr.endIndex))
// 調用 remove(at:) 方法可以在一個字串的指定索引刪除一個字元,
// 調用 removeSubrange(_:) 方法可以在一個字串的指定索引刪除一個子字串
welcomeStr.remove(at: welcomeStr.index(before: welcomeStr.endIndex))
let renge = welcomeStr.index(welcomeStr.endIndex, offsetBy: -6)..<welcomeStr.endIndex
welcomeStr.removeSubrange(renge)
// 注意 : 你可以使用 insert(_:at:) , insert(contentsOf:at:) , remove(at:) 和 removeSubrange(_:) 方法在任意一個遵循的並確認的 RangeReplaceableCollection 協議的類型裡面 , 如上文所示是使用在 string 中, 您也可以使用在 Array , dictionary 和 set 之中
// 比較字串
// swift 提供了三種方式來比較文本值, 字串字元相等, 首碼相等 和 尾碼相等
// 字串/字元相等
// 字串/字元可以使用等於操作符(==), 和不等於操作符(!=)
let quotation = "we‘re a lot alike, you and I."
let sameQuotation = "we‘re a lot alike, you and I."
if quotation == sameQuotation {
print("There two strings are considered equal")
}
// 首碼/尾碼相等
// 通過調用字串的 hasPrefix(_:) / hasSuffix(_:) 方法來檢查字串是否擁有特定首碼/尾碼, 兩個方法均接受一個 String 類型的參數, 並返回一個布爾值
// 字串的 Unicode 表示形式
// 當一個 Unicode 字串被寫進文字檔或者其他儲存是, 字串中的 Unicode 標量會用 Unicode 定義的幾種 編碼格式 (encodeing forms) 編碼, 每一個字串中的小塊編碼被稱為 代碼單元 (code units) , 這些包括UTF-8編碼合適(編碼字串為8位的代碼單元), UTF-16, UTF-32
// swift 提供了幾種不同的方式來訪問字串的 Unicode 表示形式
// 你可以利用 for-in 來對字串進行遍曆, 從而以 Unicode 可擴充的字元群集的方式訪問每一個 cahracer 值
// UTF-8 表示
// 你可以通過 String 的 UTF-8 屬性來訪問他的 UTF-8 表示
Swift 學習- 04 -- 字串和字元