String Swift:在索引处安全获取字符
使用内置方法,可以通过以下方式访问字符串索引i处的元素:String Swift:在索引处安全获取字符,string,swift,String,Swift,使用内置方法,可以通过以下方式访问字符串索引i处的元素: let s = "string" s[advance(s.startIndex,i)] 但是,如果i超出范围,则会导致运行时错误。如果索引超出范围,是否有一种内置方法来实现这一点,并使其返回nil?考虑到几乎所有东西都存在可选链接,我希望这是可用的。有–advance的第二个版本采用了第三个参数,一个不超出以下范围的索引: let s = "string" let idx = advance(s.startIndex, i, s.en
let s = "string"
s[advance(s.startIndex,i)]
但是,如果
i
超出范围,则会导致运行时错误。如果索引超出范围,是否有一种内置方法来实现这一点,并使其返回nil
?考虑到几乎所有东西都存在可选链接,我希望这是可用的。有–advance的第二个版本采用了第三个参数,一个不超出以下范围的索引:
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.preforcent())]
(此处必须检查字符串是否为空,原因有二:一是如果为空,则下标无效;二是如果startIndex==endIndex
则endIndex.preference()
无效)
最后,要注意将来自startIndex
的advance
调用放在一个循环中<代码>前进从一个点开始不是一个恒定的时间操作,它是线性的。因此,如果在字符串长度的循环中调用它,则算法将是二次的。如果需要遍历字符串,最好通过不断增加索引来完成,或者更好地使用更高级别的函数,如map
或filter