在数组的reduce()函数中是否有一种类似于for循环中的break的方法?
例如,考虑一个数组:
var flags = [false, false, true, false, false, true, false]
...并且我需要对它们进行累积 ||
。使用 for
循环,下面的方法是可行的:
var resultByFor = false
for flag in flags {
if flag {
resultByFor = true
break
}
}
...也就是说,一旦我们第一次得到true
结果,就没有必要继续循环了,因为最终结果无论如何都将是true
。
使用reduce()
,以下代码看起来相当简洁整洁:
var resultByReduce = flags.reduce(false) { $0 || $1 }
然而,对于给定的数组,在示例中,for
循环体只会执行3次,而reduce()
函数闭包将被完整地触发7次。
是否有办法让reduce()
在第三次迭代时也停止(就像在for
循环中可以做的那样)?
[更新]
我过于简化了问题。原始问题更像是这样的:
extension Int {
func isWholeMultiplesOf(base: Int) -> Bool {
return (self % base) == 0
}
}
var numbers = [3, 5, 6, 7, 2, 3, 8]
var resultByFor = false
// The loop body will be triggered only 3 times
for number in numbers {
if number.isWholeMultiplesOf(2) {
resultByFor = true
break
}
}
// The closure of reduce() will be triggered 7 times
var resultByReduce = numbers.reduce(false) {
$0 || $1.isWholeMultiplesOf(2)
}
我有一个对象数组,想知道其中是否至少有一个对象具有某个方法并且返回值为true
。
reduce
像contains
和filter
一样会迭代所有的项。我认为第一个例子是正确的。 - Maxim Shoustin