Swift 2.2、如何合并for循环语句?

In Swift 2.2, how to consolidate the for-loop statement?

在 Swift 2.2 中,C 风格的 for 语句已被弃用,因此我修改了以下 for 循环:

for var idx=data.count-1; idx>=0; --idx

进入

for idx in (0...data.count-1).reverse()  // <--- new statement

但是我发现,当data.count在执行过程中为0时,新语句会崩溃并报错fatal error: Can't form range with end < start

是否有 best/standard 方法来为这种情况编码?

P.S。我想我必须使用不同种类的 loops/syntax 来替换我统一的 C 风格循环。欢迎对此提出任何进一步的评论或建议。

您应该使用 Strideable.stride(through:by:) 来生成您的 for 循环范围,如下所示:

for idx in (data.count-1).stride(through: 0, by: -1) {
    print(idx)
}

即使 data.count == 0 也有效。

创建范围为

0 ... data.count-1
如果 data.count 为零,

将以运行时异常终止。这是 通常最好使用 ..< 运算符来创建一个范围 省略其上限值,在您的情况下:

0 ..< data.count

这也适用于 data.count == 0 并创建一个空的 在这种情况下的范围。这适用于 向前和向后迭代:

for idx in 0 ..< data.count { ... }
for idx in (0 ..< data.count).reverse() { ... }

(当然,对于第二种情况,stride() 是一个明智的选择。)

改为使用 for idx in (0..<data.count).reverse()。这将在 data.count == 0.

时形成您想要的空范围

这么简单的循环,不需要算术运算。

如果data是一个数组,使用indices:

for index in data.indices {
}

for index in data.indices.reverse() {
}

或直接访问数据

for item in data {
}

for item in data.reverse() {
}

或前面使用enumerate

的组合
for (index, item) in data.enumerate() {
}

注意上面所有的for-in循环也可以写成forEach:

data.indices.forEach {
}