在reduce中使用逻辑运算符作为组合闭包

fpg*_*503 22 closures functional-programming logical-operators swift swift2

我试图Bool通过使用以下代码应用逻辑运算符OR(||)来减少s 数组,但是我得到一个错误:

func reduceBools(values: [Bool]) -> Bool {
    return values.reduce(false, combine: ||)
}
Run Code Online (Sandbox Code Playgroud)

对成员'||'的模糊引用

类似于整数,代码就像一个魅力.

func reduceInts(values: [Int]) -> Int {
    return values.reduce(0, combine: +)
}
Run Code Online (Sandbox Code Playgroud)

我能够通过添加一个||函数(下面的代码)或使用{ $0 || $1 }闭包来使它工作,但我不喜欢这些方法,我宁愿只是传递运算符.

func ||(lhs: Bool, rhs: Bool) -> Bool {
    return lhs || rhs
}
Run Code Online (Sandbox Code Playgroud)

逻辑AND(&&)运算符也会发生同样的事情.

如何在不使用上述黑客的情况下使其工作?

dfr*_*fri 27

作为替代方案,您可以使用以下方法

// ||
func reduceBoolsOr(values: [Bool]) -> Bool {
    return values.contains(true)
}

// &&
func reduceBoolsAnd(values: [Bool]) -> Bool {
    return !values.contains(false)
}
Run Code Online (Sandbox Code Playgroud)

请注意,.reduce 它带有开销.如果最终结果是您的问题的重要性(而不是在此上下文中查询||&&操作符的意外行为),那么上面的实用方法可能会有所帮助,即使它没有真正减少数组,但是产生由于布尔类型的简单性质,结果相同.

  • 我认为在这种情况下使用 contains 更好,因为您正在描述想要获得的结果,而不是如何计算它。它比通常的函数式方法更具声明性。:) (2认同)

Eru*_*aru 7

斯威夫特 4.2+ / Xcode 10.0+

在现代版本中SwiftallSatisfy函数,它检查所有元素是否满足某些规则。


在 OP 的情况下:

values.allSatisfy { $0 }
Run Code Online (Sandbox Code Playgroud)


ldi*_*ndu 6

以下方法将起作用

values.reduce(false) { $0 || $1 }
Run Code Online (Sandbox Code Playgroud)