? ? 我們可以通過(guò)調(diào)用方法锦爵,屬性或者下標(biāo)去訪問(wèn)或者修改字符串含鳞。
字符串索引
? ? 每一個(gè)字符串都有一個(gè)相關(guān)聯(lián)的索引類型宛篇,String.index,對(duì)應(yīng)于字符串中每個(gè)字符的位置跌捆。
? ? 如上一章所述徽职,不同的字符需要不同的空間去存儲(chǔ),因此位了確定處于特定位置的字符佩厚,需要從起始遍歷一次字符串姆钉。也就是因?yàn)檫@個(gè)原因,Swift中的String無(wú)法用整型值進(jìn)行索引抄瓦。
? ? 使用屬性startIndex可以訪問(wèn)字符串第一個(gè)字符的位置潮瓶,使用屬性endIndex可以訪問(wèn)字符串最后一個(gè)字符的位置。屬性endIndex無(wú)法作為字符串下標(biāo)的參數(shù)钙姊。如果字符串是空的毯辅,startIndex等于endIndex。
? ? 如果希望獲取一個(gè)已知索引的前面或者后面的索引,可以使用字符串提供的index(before:)方法和index(after:)方法摸恍。要訪問(wèn)某個(gè)遠(yuǎn)離已知索引的索引悉罕,可以使用index(_:offsetBy:)方法,而不需要多次調(diào)用前述的方法立镶。
? ? 可以使用下標(biāo)的語(yǔ)法獲取字符串某個(gè)特定索引的字符壁袄。
? ??????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
? ? 獲取超過(guò)字符串范圍的索引或者不在字符串中的某個(gè)字符會(huì)導(dǎo)致一個(gè)運(yùn)行時(shí)錯(cuò)誤:
? ??????greeting[greeting.endIndex] // Error
????????greeting.index(after: greeting.endIndex) // Error
? ? 通過(guò)屬性indices可以獲取字符串中每一個(gè)字符的索引:
? ??????for index in greeting.indices {
????????? ? print("\(greeting[index]) ", terminator: "")
????????}
????????// 打印 "G u t e n? T a g !?
NOTE:實(shí)現(xiàn)了Collection協(xié)議的類都提供了屬性startIndex和endIndex以及方法index(before:), index(after:), 和 index(_:offsetBy:)。當(dāng)然包括這里的String媚媒,還有Array嗜逻,Dictionary,Set等缭召。
插入和刪除
? ? 在字符串特定的位置插入一個(gè)字符栈顷,可以使用方法insert(_:at:),在特定的位置插入另外一個(gè)字符串嵌巷,可以使用方法insert(contentsOf:at:) 萄凤。
? ??????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!”
? ? 要移除一個(gè)字符串特定位置的字符,使用方法remove(at:)搪哪,要移除一個(gè)特定范圍內(nèi)的子字符串靡努,使用方法removeSubrange(_:)。
? ??????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”
NOTE:實(shí)現(xiàn)了RangeReplaceableCollection協(xié)議的類都提供了方法insert(_:at:), insert(contentsOf:at:), remove(at:), and removeSubrange(_:)。當(dāng)然包括這里的String惑朦,還有Array兽泄,Dictionary,Set等漾月。