执行闭包代替 if 语句的条件

Executing a closure in place of the condition of an if statement

以下作品。它打印:至少有一个为真

let arr = [false, false, false, true, false, false, true, false]

// Variable set by executing a closure...
let hasAtLeastOneTrue: Bool = {
    var x = false
    arr.forEach {
        x = x || [=10=]
   }
    return x
}()

if hasAtLeastOneTrue {
    print("At least one true")
} else {
    print("All false")
}

是否可以通过消除常量 hasAtLeastOneTrue 并将条件替换为闭包来压缩代码?类似于:

if {CLOSURE CODE}() {
    print("At least one true")
} else {
    print("All false")
}

是的。关键是用方括号包裹整个闭包调用:

if ({
    var x = false
    arr.forEach {
        x = x || [=10=]
   }
    return x
}()) {
    print("At least one true")
} else {
    print("All false")
}

虽然我认为这比 if hasAtLeastOneTrue { ... 可读性差很多。我建议你仍然命名你的闭包,或者只使用内部函数。

请注意,在这种情况下,您可以这样做:

if arr.contains(true) {
    print("At least one true")
} else {
    print("All false")
}