2016-11-22 38 views
0

當我想要通過並從數組中移除項目或項目時(當滿足某些條件時),我通常會在C樣式for-loop中向後迭代並移除按索引逐項排列,避免了要處理的下一個項目的索引號被更改的問題,或者影響了循環通過次數的列表大小的變化。但C for循環已經在斯威夫特3.在Swift中向後迭代時安全地移除項目3

這裏被拆除是我環路初始化雨燕2.3代碼:

for (var i = allowedItems.count - 1; i > -1; i -= 1) 

這裏是由斯威夫特3轉換器創建的怪物:

for (i in ((-1 + 1)...allowedItems.count - 1).reversed()) 

但是這個版本不能編譯。 (「in」運算符中的「Expected」,「separator」)。

我簡化 「-1 + 1」 位爲零:

for (i in (0...allowedItems.count - 1).reversed()) 

現在誤差 「爲for-each循環預期序列表達」。

什麼是安全的,希望合理優雅的方式在Swift 3中反向迭代,其中索引或計數器變量可用於指定哪些項目應該被刪除?這種類型的邏輯出現在我的代碼中的許多地方,所以我想確保找到最佳解決方案。

謝謝。

+1

您是否嘗試過'for(i,item)in allowedItems.enumerated()。reversed(){...}'? – dasblinkenlight

回答

2

使用stride

for i in stride(from: allowedItems.count - 1, through: 0, by: -1) { 

} 
+0

來自代碼不同的答案,馬特以及來自dasblinkenlight的評論似乎都是實現這一目標的可行方法。我把所有這些都提升了,但是將其標記爲答案,因爲它(至少對我來說)滿足了優雅和容易理解的標準。 –

2

什麼是斯威夫特落後迭代3

內置方式的安全,並希望合理優雅的方式是:

for i in (0 ..< allowedItems.count).reversed() 

優雅方式i S:

for i in allowedItems.count >>> 0 

(其中>>>是我定義here運營商定製)。

2

什麼是迭代 落後斯威夫特3,其中索引或計數器變量由 可用於指定使用哪個項目應刪除的安全,並希望合理優雅的方式?

這不回答技術問題,但可能是潛在的XY的問題:你有沒有考慮乾脆濾波基於標準您陣「時,某些條件得到滿足」

func certainConditionsForKeepingAreMet(_ element: YourElementType) -> Bool { /* ... */ } 
allowedItems = allowedItems.filter(certainConditionsForKeepingAreMet) 

例如,

var allowedItems = [1, 3 ,6, 2] 
func certainConditionsForKeepingAreMet(_ element: Int) -> Bool { return element < 3 } 
allowedItems = allowedItems.filter(certainConditionsForKeepingAreMet) 
print(allowedItems) // [1, 2] 

如果你想刪除和使用移除的元素(上即時),你可以簡單地管將被去除,以一些「使用這個元素」功能元素,檢查元素條件的過程。

func doSomethingWith(_ element: Int) { print("Removed", element) } 

func certainConditionsForKeepingAreMet(_ element: Int) -> Bool { 
    if element >= 3 { 
     doSomethingWith(element) 
     return false 
    } 
    return true 
} 

var allowedItems = [1, 3 ,6, 2] 
allowedItems = allowedItems.filter(certainConditionsForKeepingAreMet) 
/* Removed 3 
    Removed 6 */ 
print(allowedItems) // [1, 2]