使用內置的方法安全地獲得字符,可以通過使用一個字符串的索引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
做到這一點。