使用内置方法,可以使用:
访问字符串索引i处的元素let s = "string"
s[advance(s.startIndex,i)]
但是,如果i
超出范围,则会导致运行时错误。是否有内置的方法来实现这一点,并在索引超出范围时让它返回nil
?作为可选链接,几乎所有东西都存在,我希望这个可用。
答案 0 :(得分:1)
还有 - 第二个版本的进展需要第三个参数,一个不超越的指数:
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()
无效)
最后,请注意在advance
中调用startIndex
这样的循环。 advance
从一个点开始不是一个恒定时间操作,它是线性的。因此,如果您在字符串长度的循环中调用它,您的算法将是二次的。如果您需要遍历字符串,最好通过不断递增索引来实现,甚至可以使用更高级别的函数(如map
或filter
)。