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() }