假設我有一個僅持續一定時間的功能串列
我會定期遍歷一系列功能,檢查時間是否結束。當條件滿足時,我洗掉了特定元素,但出現索引錯誤 - 因為陣列長度發生變化并且 for 回圈仍然超過陣列的“舊”長度。
這樣做的正確方法是什么?(假設陣列很大,我是否需要創建一個新陣列,是否需要創建第二個回圈?...)
struct Feature {
let name: String
var remains: Int
}
var features = [Feature(name: "1", remains: 2), Feature(name: "2", remains: 3), Feature(name: "3", remains: 3)]
while true {
for index in 0..<features.count {
features[index].remains -= 1
if features[index].remains == 0 {
features.remove(at: index)
}
}
}
uj5u.com熱心網友回復:
如果此代碼片段確實是您需要做的(如@Joakim 所說,可能還有其他選項),您需要確保洗掉物件后索引仍然有效。
實作此目的的一種簡單方法是從頭到尾向后遍歷陣列,只需添加一個.reversed():
for index in (0..<features.count).reversed() { ... }
也就是說,如果您可以將所有專案的洗掉移動remains == 0到稍后通過,那么它就像
features.removeAll { $0.remains == 0 }
uj5u.com熱心網友回復:
如果陣列非常大,我會說保留一個外部變數并增加它而不是減少所有資料中的值會簡單得多。
var currentLimit: Int = 0
...
curentLimit = 1
features.removeAll { $0.remains < currentLimit }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344346.html
