有没有办法打破Swift中数组的reduce函数?

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.

Eri*_*rde 8

正如其他人所建议的那样,您可以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)