使用内置的方法安全地获得字符,可以通过使用一个字符串的索引i访问元素:斯威夫特:在指数
let s = "string"
s[advance(s.startIndex,i)]
但是,如果i
超出范围,这将导致运行时错误。如果索引超出范围,是否有内置的方法来实现这一目标并使其返回nil
?看到任何链接存在几乎所有的东西,我希望这是可用的。
使用内置的方法安全地获得字符,可以通过使用一个字符串的索引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()
无效)
最后,当心把advance
从startIndex
打电话给这样一个循环。从一个点不是一个恒定的时间操作,它是线性的。所以,如果你在字符串长度上循环调用它,你的算法将是二次的。如果你需要走的字符串,最好通过连续递增的索引,甚至更好的使用更高级的功能,像map
或filter
做到这一点。