有没有办法在Swift中处理反向范围?
例如:
for i in 5...1 { // do something }
是一个无限循环。
在较新版本的Swift中,该代码可以编译,但在运行时会出现错误:
致命错误:无法使用upperBound <lowerBound形成Range
我知道我可以1..5代替使用计算j = 6 - i和j用作索引。我只是想知道是否还有更清晰的地方?
1..5
j = 6 - i
j
更新以获取最新的Swift 3(仍可在Swift 4中使用)
您可以reversed()在范围上使用该方法
reversed()
for i in (1...5).reversed() { print(i) } // 5 4 3 2 1
或stride(from:through:by:)方法
stride(from:through:by:)
for i in stride(from:5,through:1,by:-1) { print(i) } // 5 4 3 2 1
stide(from:to:by:) 相似,但不包括最后一个值
stide(from:to:by:)
for i in stride(from:5,to:0,by:-1) { print(i) } // 5 4 3 2 1
更新以获取最新的Swift 2
首先,协议扩展更改了reverse使用方式:
reverse
for i in (1...5).reverse() { print(i) } // 5 4 3 2 1
Xide 7 Beta 6中对Stride进行了重新设计。新用法是:
for i in 0.stride(to: -8, by: -2) { print(i) } // 0 -2 -4 -6 for i in 0.stride(through: -8, by: -2) { print(i) } // 0 -2 -4 -6 -8
它也适用于Doubles:
Doubles
for i in 0.5.stride(to:-0.1, by: -0.1) { print(i) }
提防浮点在此处比较界限。
Swift 1.2的早期编辑 :从Xcode 6 Beta 4开始, by 和 ReverseRange 不再存在:[
如果您只是想反转范围,则只需使用 反转 功能:
for i in reverse(1...5) { println(i) } // prints 5,4,3,2,1
正如 0x7fffffff 发布的那样,有一个新的 跨步 构造可用于迭代和递增任意整数。苹果还表示,浮点支持即将到来。
来自他的回答:
for x in stride(from: 0, through: -8, by: -2) { println(x) // 0, -2, -4, -6, -8 } for x in stride(from: 6, to: -2, by: -4) { println(x) // 6, 2 }