2015-02-11 62 views
3

使用内置的方法安全地获得字符,可以通过使用一个字符串的索引i访问元素:斯威夫特:在指数

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

但是,如果i超出范围,这将导致运行时错误。如果索引超出范围,是否有内置的方法来实现这一目标并使其返回nil?看到任何链接存在几乎所有的东西,我希望这是可用的。

回答

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

最后,当心把advancestartIndex打电话给这样一个循环。从一个点不是一个恒定的时间操作,它是线性的。所以,如果你在字符串长度上循环调用它,你的算法将是二次的。如果你需要走的字符串,最好通过连续递增的索引,甚至更好的使用更高级的功能,像mapfilter做到这一点。