2015-02-11 144 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做到這一點。