is there way similar break
for
loop in array's reduce()
function?
e.g. consider have array:
var flags = [false, false, true, false, false, true, false]
... , need cumulative ||
on them. for
loop, following possible:
var resultbyfor = false flag in flags { if flag { resultbyfor = true break } }
... i.e. @ moment our first true
there no need finish loop result true
anyway.
with reduce()
, following looks quite neat , tidy:
var resultbyreduce = flags.reduce(false) { $0 || $1 }
however, array given in example, for
loop body executed 3 times, while reduce()
function closure triggered full 7 times.
is there way make reduce()
bail out on 3rd iteration (just can done in for
loop)?
[upd]
i oversimplified question. original problem more this:
extension int { func iswholemultiplesof(base: int) -> bool { return (self % base) == 0 } } var numbers = [3, 5, 6, 7, 2, 3, 8] var resultbyfor = false // loop body triggered 3 times number in numbers { if number.iswholemultiplesof(2) { resultbyfor = true break } } // closure of reduce() triggered 7 times var resultbyreduce = numbers.reduce(false) { $0 || $1.iswholemultiplesof(2) }
... i.e. have array of objects , want know if there @ least 1 of them has method evaluating true
.
as eric , fogmeister suggested, following trick:
// closure of contains() triggered 3 times var resultbycontains = contains(numbers) { $0.iswholemultiplesof(2) }
as others have suggested, can use contains
purpose:
var flags = [false, false, true, false, false, true, false] contains(flags,true) //--> true
another option use find
search first instance of you're looking for, in case 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)