1

在 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

是否有针对这种情况进行编码的最佳/标准方法?

PS 我想我必须使用不同类型的循环/语法来替换我统一的 C 风格循环。欢迎对此提出任何进一步的意见或建议。

4

4 回答 4

3

创建一个范围为

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()对于第二种情况是一个明智的选择。)

于 2016-03-27T08:33:05.197 回答
2

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

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

即使data.count == 0.

于 2016-03-27T07:06:10.583 回答
2

在这样一个简单的循环中,不需要算术运算。

如果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 {
}
于 2016-03-27T08:39:13.923 回答
1

相反,使用for idx in (0..<data.count).reverse(). 这将形成您想要的空范围data.count == 0

于 2016-03-27T08:38:09.140 回答