有没有办法在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开始,byReverseRange不再存在:[

如果你只是想反转一个范围,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
}

Swift相关问答推荐

多个提取来计算核心数据中的记录

一种函数,用于判断变量的类型是否为在SWIFT中作为参数传递的类型

可选,类似于自定义类型的初始化

为什么我不能在这个 Swift 间接枚举中返回 self ?

本地对象的异步/等待引用捕获总是安全的还是理论上不安全?

SwiftUI 无法在实时活动中显示 SpriteView

如何在 SwiftUI 中创建条件内容?

当变量首次用于其自己的初始化时,如何清除变量...在初始化之前使用错误?

如何打印出此 struct 中的数据?

您是否必须手动指定您的 DispatchQueue 是串行的?

Swift Components.Url 返回错误的 URL

在 RealityKit 中创建转场

如何将回调传递给 View init

RealityKit – 无法加载 ARView(发现为零)

临时添加到视图层次 struct 后,Weak view引用不会被释放

UnkeyedEncodingContainer 和 KeyedEncodingContainerProtocol 中的 superEncoder 是什么?

将项目引用添加到 Swift iOS XCode 项目并调试

在 Xcode 中自动实现 Swift 协议方法

如何快速从另一个视图控制器重新加载表格视图

将 UIImage 剪成圆形