Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 有没有办法从数组';s在Swift中的reduce功能?_Arrays_Swift_Break_Array Reduce - Fatal编程技术网

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让我看看@我的网站又上线了。请随意查看:)谢谢您提出问题@非常好的解决方案!谢谢分享。