在Swift 3中向后迭代时安全地删除项目

时间:2016-11-22 16:37:35

标签: swift loops iteration swift3

当我想传递并从数组中删除一个或多个项目时(当满足某些条件时),我通常在C风格的for循环中向后迭代并按索引删除项目,避免索引问题正在更改要处理的下一个项目的数字,或者更改列表的大小会影响循环通过的次数。但是在Swift 3中删除了C for-loop。

这是我用于循环初始化的Swift 2.3代码:

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

这是Swift 3转换器创建的怪物:

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

但是这个版本不能编译。 ("预期','分隔符"在" in"运营商)。

我简化了" -1 + 1"位为零:

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

现在错误是" for-each循环的预期序列表达式"。

在Swift 3中向后迭代的安全且有希望合理优雅的方法是什么,其中索引或计数器变量可用于指定应删除哪个项目?这种类型的逻辑出现在我的代码中的许多地方,所以我想确保找到最佳解决方案。

感谢。

3 个答案:

答案 0 :(得分:2)

使用stride

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

}

答案 1 :(得分:2)

  

在Swift 3中向后迭代的安全且有希望相当优雅的方法是什么

内置方式是:

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

优雅的方式是:

for i in allowedItems.count >>> 0

(其中>>>是我定义here)的自定义运算符。

答案 2 :(得分:2)

  

什么是安全且有希望合理优雅的迭代方式   在Swift 3中向后,在其中生成索引或计数器变量   可用于指定应删除项目

这不能回答技术问题,但可能是基本的XY问题:您是否考虑过根据“满足某些条件时”的标准过滤数组?

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

E.g。

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]