当我想传递并从数组中删除一个或多个项目时(当满足某些条件时),我通常在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中向后迭代的安全且有希望合理优雅的方法是什么,其中索引或计数器变量可用于指定应删除哪个项目?这种类型的逻辑出现在我的代码中的许多地方,所以我想确保找到最佳解决方案。
感谢。
答案 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]