你不是唯一一个找不到解决方法的人。
String
没有实现RandomAccessIndexType
,可能是因为它们允许具有不同字节长度的字符。这就是为什么我们必须使用string.characters.count
(在 Swift 1.x 中为count
或countElements
)来获取字符数的原因。这也适用于位置。 _position
可能是原始字节数组中的索引,他们不想暴露出来。 String.Index
旨在保护我们免受访问字符中间的字节的影响。
这意味着您获得的任何索引都必须从String.startIndex
或String.endIndex
创建(String.Index
实现BidirectionalIndexType
)。可以使用successor
或predecessor
方法创建其他索引。
现在有一组方法(在Swift 1.x中为函数)可帮助我们处理索引:
Swift 4.x
let text = "abc"
let index2 = text.index(text.startIndex, offsetBy: 2)
let lastChar: Character = text[index2]
let characterIndex2 = text.index(text.startIndex, offsetBy: 2)
let lastChar2 = text[characterIndex2]
let range: Range<String.Index> = text.range(of: "b")!
let index: Int = text.distance(from: text.startIndex, to: range.lowerBound)
Swift 3.0
->
Swift 3.0
let text = "abc"
let index2 = text.index(text.startIndex, offsetBy: 2)
let lastChar: Character = text[index2]
let characterIndex2 = text.characters.index(text.characters.startIndex, offsetBy: 2)
let lastChar2 = text.characters[characterIndex2]
let range: Range<String.Index> = text.range(of: "b")!
let index: Int = text.distance(from: text.startIndex, to: range.lowerBound)
Swift 2.x
->
Swift 2.x
let text = "abc"
let index2 = text.startIndex.advancedBy(2)
let lastChar: Character = text[index2]
let lastChar2 = text.characters[index2]
let range: Range<String.Index> = text.rangeOfString("b")!
let index: Int = text.startIndex.distanceTo(range.startIndex)
Swift 1.x
let text = "abc"
let index2 = advance(text.startIndex, 2)
let lastChar: Character = text[index2]
let range = text.rangeOfString("b")
let index: Int = distance(text.startIndex, range.startIndex)
使用 String.Index
处理字符串比较麻烦,但是使用一个包装器通过整数索引(参见 https://dev59.com/RmAg5IYBdhLWcg3wDHU3#25152652)来索引是危险的,因为它隐藏了真实索引的低效性。
请注意,Swift 的索引实现存在问题,即为一个字符串创建的索引/范围不能可靠地用于另一个字符串,例如:
Swift 2.x
let text: String = "abc"
let text2: String = ""
let range = text.rangeOfString("b")!
let substring: String = text2[range]
let intIndex: Int = text.startIndex.distanceTo(range.startIndex)
let startIndex2 = text2.startIndex.advancedBy(intIndex)
let range2 = startIndex2...startIndex2
let substring: String = text2[range2]
Swift 1.x
的翻译是:
Swift 1.x
。
let text: String = "abc"
let text2: String = ""
let range = text.rangeOfString("b")
let substring: String = text2[range]
let intIndex: Int = distance(text.startIndex, range.startIndex)
let startIndex2 = advance(text2.startIndex, intIndex)
let range2 = startIndex2...startIndex2
let substring: String = text2[range2]