Arrays 有没有办法从数组';s在Swift中的reduce功能?
在数组的Arrays 有没有办法从数组';s在Swift中的reduce功能?,arrays,swift,break,array-reduce,Arrays,Swift,Break,Array Reduce,在数组的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
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
}
}
。。。i、 e.在我们得到第一个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)
}
。。。i、 e.我有一个对象数组,我想知道其中是否至少有一个对象具有某种方法计算为true
,正如其他人所建议的那样,您可以使用包含
用于此目的:
var flags = [false, false, true, false, false, true, false]
contains(flags,true) //--> true
另一个选项是使用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)
在Swift标准库中,它不是现成的,但您可以制作它。在本文中,我描述了我提出的解决方案。在您的情况下,在呼叫端看起来是这样的:
flags.reduce(false,{$0 | |$1},直到:{$0})
我不这么认为reduce
like包含和filter
迭代所有项。我认为第一个例子是一个合适的例子,你可以把它写成扩展。这看起来像是reduce,但要提前中断。为什么不使用contains呢?一般来说,如果您发现自己需要中断reduce,就不应该使用reduce。使用for
循环比扭曲自己避免循环要好得多。如果您不喜欢它在代码中的外观,请按照contains
或find
的行将其封装在一个通用函数中,并在循环体中提前返回。这似乎是一个很好的解决方案!可悲的是,你的博客似乎不再活跃了。你能在这里发布解决方案吗?哦,真的@ZeMoon让我看看@我的网站又上线了。请随意查看:)谢谢您提出问题@非常好的解决方案!谢谢分享。