Есть ли способ сделать что-то похожее на break
из цикла for
, но в функции массива reduce()
?
например. У меня есть массив:
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
)?
[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)
}
... т.е. у меня есть массив объектов, и я хочу знать, есть ли хотя бы один из них, который имеет определенный метод, оценивающий true
.