Swift:安全获取索引处的字符

3

使用内置的方法,可以通过以下方式访问字符串中索引为 i 的元素:

let s = "string" 
s[advance(s.startIndex,i)]

然而,如果i超出范围,将导致运行时错误。是否有内置的方法来实现,当索引超出范围时返回nil?既然可选链适用于几乎所有事情,我希望这也可以使用。

1个回答

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()无效)

最后,请注意不要在循环中像这样从startIndex调用advance。从某个点开始的advance不是常量时间操作,而是线性的。因此,如果您在字符串长度上调用它,则算法将是二次的。如果您需要遍历字符串,最好通过不断增加索引来实现,或者更好地使用高级函数,例如mapfilter


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接