cou*_*elk 16 arrays break array-reduce swift
有没有办法做类似的东西break从一个for循环,但在阵列的reduce()功能?
例如,考虑我有一个数组:
var flags = [false, false, true, false, false, true, false]
Run Code Online (Sandbox Code Playgroud)
......我需要累积||起来.使用for循环,可以执行以下操作:
var resultByFor = false
for flag in flags {
if flag {
resultByFor = true
break
}
}
Run Code Online (Sandbox Code Playgroud)
...即在我们获得第一个时刻,true没有必要完成循环,因为结果true无论如何.
使用reduce(),以下看起来非常整洁:
var resultByReduce = flags.reduce(false) { $0 || $1 }
Run Code Online (Sandbox Code Playgroud)
但是,对于示例中给出的数组,for循环体仅执行3次,而reduce()函数闭包将被触发完整7次.
有没有办法reduce()在第3次迭代中拯救(就像它可以在for循环中完成)?
[UPD]
我过分简化了这个问题.原来的问题更像这样:
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)
}
Run Code Online (Sandbox Code Playgroud)
...即我有一个对象数组,我想知道是否至少有一个对象有某种方法进行评估true.
正如其他人所建议的那样,您可以contains用于此目的:
var flags = [false, false, true, false, false, true, false]
contains(flags,true) //--> true
Run Code Online (Sandbox Code Playgroud)
另一个选择是用于find搜索您要查找的内容的第一个实例,在这种情况下true:
var flags = [false, false, true, false, false, true, false]
find(flags,true) // --> 2, returns nil if not found
let containsTrue = (find(flags,true) != nil)
Run Code Online (Sandbox Code Playgroud)