我们可以通过调用方法,属性或者下标去访问或者修改字符串。
字符串索引
每一个字符串都有一个相关联的索引类型,String.index,对应于字符串中每个字符的位置。
如上一章所述,不同的字符需要不同的空间去存储,因此位了确定处于特定位置的字符,需要从起始遍历一次字符串。也就是因为这个原因,Swift中的String无法用整型值进行索引。
使用属性startIndex可以访问字符串第一个字符的位置,使用属性endIndex可以访问字符串最后一个字符的位置。属性endIndex无法作为字符串下标的参数。如果字符串是空的,startIndex等于endIndex。
如果希望获取一个已知索引的前面或者后面的索引,可以使用字符串提供的index(before:)方法和index(after:)方法。要访问某个远离已知索引的索引,可以使用index(_:offsetBy:)方法,而不需要多次调用前述的方法。
可以使用下标的语法获取字符串某个特定索引的字符。
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
获取超过字符串范围的索引或者不在字符串中的某个字符会导致一个运行时错误:
greeting[greeting.endIndex] // Error
greeting.index(after: greeting.endIndex) // Error
通过属性indices可以获取字符串中每一个字符的索引:
for index in greeting.indices {
print("\(greeting[index]) ", terminator: "")
}
// 打印 "G u t e n T a g !
NOTE:实现了Collection协议的类都提供了属性startIndex和endIndex以及方法index(before:), index(after:), 和 index(_:offsetBy:)。当然包括这里的String,还有Array,Dictionary,Set等。
插入和删除
在字符串特定的位置插入一个字符,可以使用方法insert(_:at:),在特定的位置插入另外一个字符串,可以使用方法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!”
要移除一个字符串特定位置的字符,使用方法remove(at:),要移除一个特定范围内的子字符串,使用方法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:实现了RangeReplaceableCollection协议的类都提供了方法insert(_:at:), insert(contentsOf:at:), remove(at:), and removeSubrange(_:)。当然包括这里的String,还有Array,Dictionary,Set等。