您可以通过其方法和属性或使用下标语法来访问和修改字符串。
字符串索引
每个String
值都有一个关联的索引类型,String.Index
它对应Character
于字符串中每个值的位置。
如上所述,不同的字符可能需要不同的内存量来存储,因此为了确定哪个Character
位于特定位置,您必须从开头或结尾迭代每个Unicode标量String
。因此,Swift字符串不能用整数值索引。
使用该startIndex
属性访问第一个Character
的位置String
。该endIndex
属性是a中最后一个字符后的位置String
。因此,该endIndex
属性不是字符串下标的有效参数。如果a String
是空的,startIndex
并且endIndex
是相等的。
您可以使用index(before:)
和index(after:)
方法访问给定索引之前和之后的索引String
。要访问远离给定索引的索引,可以使用该index(_:offsetBy:)
方法而不是多次调用其中一种方法。
您可以使用下标语法来访问Character
特定String
索引。
- 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
尝试访问字符串范围Character
之外的索引或字符串范围之外的索引将触发运行时错误。
- greeting[greeting.endIndex] // Error
- greeting.index(after: greeting.endIndex) // Error
使用该indices
属性可以访问字符串中各个字符的所有索引。
- for index in greeting.indices {
- print("\(greeting[index]) ", terminator: "")
- }
- // Prints "G u t e n T a g ! "
注意
您可以使用startIndex
与endIndex
属性和index(before:)
,index(after:)
以及index(_:offsetBy:)
对符合任何类型的方法Collection
的协议。这包括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"
注意
您可以使用insert(_:at:)
,insert(contentsOf:at:)
,remove(at:)
,和removeSubrange(_:)
对符合任何类型的方法RangeReplaceableCollection
的协议。这包括String
,如下图所示,以及集合类型,如Array
,Dictionary
和Set
。