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

Jua*_*nti 3 swift

我来到这里:

for x in 1...(myArray.count - 1) { task() }
Run Code Online (Sandbox Code Playgroud)

这非常难看.有没有更好的办法?

Air*_*ity 5

你必须要小心一点,好像数组是空的,这会崩溃:

let a: [Int] = []
let range = 0..<a.count-1
// fatal error: Can't form Range with end < start
Run Code Online (Sandbox Code Playgroud)

Strides没有这个问题(因为Strideable事情必须如此Comparable)所以你可以这样做:

for _ in stride(from: 0, to: a.count - 1, by: 1) {
    // will only execute if a.count > 2
    print("blah")
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你守护它,你可以使用dropFirst:

for _ in (a.isEmpty ? [] : dropFirst(a))  {
    print("blah")
}
Run Code Online (Sandbox Code Playgroud)

我强烈建议不要试图通过创建一个运行少于计数次数的伪循环来使这个看起来更整洁.Swift中没有forEach或没有repeat功能的原因.这些循环一开始看起来不错,但是它们会产生很多错误(例如,return或者continue不按照您预期的方式工作,使用高阶函数进行外部突变通常被认为是不好的做法- 而常规for循环则表明可能存在突变/副作用).

最新的扩展类型解决方案可能是扩展Array到安全的drop-first:

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()
}
Run Code Online (Sandbox Code Playgroud)