斯威夫特:在索引处安全地获得角色

时间:2015-02-11 00:01:37

标签: string swift

使用内置方法,可以使用:

访问字符串索引i处的元素
let s = "string" 
s[advance(s.startIndex,i)]

但是,如果i超出范围,则会导致运行时错误。是否有内置的方法来实现这一点,并在索引超出范围时让它返回nil?作为可选链接,几乎所有东西都存在,我希望这个可用。

1 个答案:

答案 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从一个点开始不是一个恒定时间操作,它是线性的。因此,如果您在字符串长度的循环中调用它,您的算法将是二次的。如果您需要遍历字符串,最好通过不断递增索引来实现,甚至可以使用更高级别的函数(如mapfilter)。