Swift:如何执行任务n-1次,其中n是数组的长度?

Swift:如何执行任务n-1次,其中n是数组的长度?,swift,Swift,我想到了这一点: for x in 1...(myArray.count - 1) { task() } 这很难看。有更好的办法吗?没有更好的办法,但是: for _ in 1..<myArray.count { task() } 您必须小心一点,因为如果阵列为空,这将崩溃: let a: [Int] = [] let range = 0..<a.count-1 // fatal error: Can't form Range with end < start 或者,如果

我想到了这一点:

for x in 1...(myArray.count - 1) { task() }
这很难看。有更好的办法吗?

没有更好的办法,但是:

for _ in 1..<myArray.count { task() }

您必须小心一点,因为如果阵列为空,这将崩溃:

let a: [Int] = []
let range = 0..<a.count-1
// fatal error: Can't form Range with end < start
或者,如果您保护它,可以使用
dropFirst

for _ in (a.isEmpty ? [] : dropFirst(a))  {
    print("blah")
}
我强烈建议不要试图通过创建一个运行时间比计数时间少一次的伪for循环来让这个看起来更整洁。Swift中没有
forEach
repeat
功能是有原因的。这种循环一开始看起来很不错,但也有很多错误(例如,
return
continue
的工作方式与您预期的不一样,使用高阶函数进行外部变异通常被认为是不好的做法,而常规的
for
循环则表明变异/副作用可能存在)

最简单的扩展类型解决方案可能是扩展
阵列
,首先进行安全下降:

extension Array {
    // version of dropFirst that returns empty array for both
    // empty and single-element array
    func safeDropFirst() -> ArraySlice<T> {
        return self.isEmpty ? [] : dropFirst(self)
    }
}

for _ in myArray.safeDropFirst() {
    doThing()
}
扩展数组{
//dropFirst的版本,该版本为两个
//空单元素数组
func safeDropFirst()->ArraySlice{
return self.isEmpty?[]:dropFirst(self)
}
}
对于myArray.safeDropFirst()中的{
doThing()
}

以下是使用Swift 2的方法:

for x in myArray where x != myArray.first { task() }

您是想从运行
task()
中收集结果,还是只是为了在其他地方改变状态。。
extension Array {
    // version of dropFirst that returns empty array for both
    // empty and single-element array
    func safeDropFirst() -> ArraySlice<T> {
        return self.isEmpty ? [] : dropFirst(self)
    }
}

for _ in myArray.safeDropFirst() {
    doThing()
}
for x in myArray where x != myArray.first { task() }