字符串索引
每个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
。