有没有办法在Swift中使用反向范围?
例如:
for i in 5...1 {
// do something
}
是一个无限循环.
在较新版本的Swift中,该代码可以编译,但在运行时会出现错误:
致命错误:无法形成上限为的范围<;洛博德
我知道我可以用1..5
来代替,计算j = 6 - i
,然后用j
作为我的索引.我只是想知道还有什么更清晰的吗?
有没有办法在Swift中使用反向范围?
例如:
for i in 5...1 {
// do something
}
是一个无限循环.
在较新版本的Swift中,该代码可以编译,但在运行时会出现错误:
致命错误:无法形成上限为的范围<;洛博德
我知道我可以用1..5
来代替,计算j = 6 - i
,然后用j
作为我的索引.我只是想知道还有什么更清晰的吗?
Update For latest Swift 3 (still works in Swift 4)
你可以在一个范围内使用reversed()
法
for i in (1...5).reversed() { print(i) } // 5 4 3 2 1
还是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:)
类似,但不包括最后一个值
for i in stride(from:5,to:0,by:-1) { print(i) } // 5 4 3 2 1
Update For latest Swift 2
首先,协议扩展改变了reverse
的使用方式:
for i in (1...5).reverse() { print(i) } // 5 4 3 2 1
Stride在Xcode 7 Beta 6中进行了修改.新用法是:
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
人:
for i in 0.5.stride(to:-0.1, by: -0.1) { print(i) }
注意这里的浮点数比较的界限.
Earlier edit for Swift 1.2:从Xcode 6 Beta 4开始,by和ReverseRange不再存在:[
如果你只是想反转一个范围,reverse功能就是你所需要的:
for i in reverse(1...5) { println(i) } // prints 5,4,3,2,1
正如0x7fffffff所发布的,有一个新的stride构造,可以用来迭代和增加任意整数.苹果还表示,浮点支持即将到来.
根据他的回答:
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
}