使用内置的方法,可以通过以下方式访问字符串中索引为 i 的元素:
let s = "string"
s[advance(s.startIndex,i)]
然而,如果i
超出范围,将导致运行时错误。是否有内置的方法来实现,当索引超出范围时返回nil
?既然可选链适用于几乎所有事情,我希望这也可以使用。
有一个进阶版,它有第三个参数——一个不要超过的索引:
let s = "string"
let idx = advance(s.startIndex, i, s.endIndex)
let s = "string"
let idx = advance(s.startIndex, 10, s.endIndex)
然后你仍然会得到一个运行时错误,因为endIndex
不是下标的有效索引。
你有两个选择,都需要额外的检查。要么检查idx != s.endIndex
。或者检查!s.isEmpty
,然后如果不是,执行s[advance(s.startIndex, i, s.endIndex.predecessor())]
。
(在这里必须检查字符串是否为空有两个原因——一个是如果为空,则没有任何下标是有效的,另一个是如果startIndex == endIndex
,则endIndex.predecessor()
无效)
最后,请注意不要在循环中像这样从startIndex
调用advance
。从某个点开始的advance
不是常量时间操作,而是线性的。因此,如果您在字符串长度上调用它,则算法将是二次的。如果您需要遍历字符串,最好通过不断增加索引来实现,或者更好地使用高级函数,例如map
或filter
。