逻辑运算符的类型是什么?

时间:2015-02-21 16:43:38

标签: swift logical-operators

我想将它们用作 Region 结构的方法的参数:

private func combineWith(region: RegionProtocol, combine: (Bool, Bool) -> Bool) -> Region {
    return Region() {point in
        combine(self.contains(point), region.contains(point))
    }
}

但显然,(Bool, Bool) -> Bool)不是什么&&或||是。如果您知道,请告诉我您是如何找到的。

1 个答案:

答案 0 :(得分:2)

如果你" cmd-click"在#34;斯威夫特"在声明中

import Swift

在Xcode中搜索||,然后您会发现它被声明为

func ||<T : BooleanType>(lhs: T, rhs: @autoclosure () -> Bool) -> Bool

原因是||运算符的&#34;短路&#34; 行为:如果是第一个 操作数为true,则根本不能评估第二个操作数。

所以你必须将参数声明为

combine: (Bool, @autoclosure () -> Bool) -> Bool

示例:

func combineWith(a : Bool, b : Bool, combine: (Bool, @autoclosure () -> Bool) -> Bool) -> Bool {
    return combine(a, b)
}

let result = combineWith(false, true, ||)
println(result)

注意: 我使用Xcode 6.1.1对此进行了测试。 autoclosure的语法 参数在Swift 1.2(Xcode 6.3)中发生了变化,但我还没有 翻译Swift 1.2的上述代码(另请参阅Rob的评论 下文)。

我现在唯一可以提供的东西非常难看 解决方法。您可以将||包装到没有的闭包中 autoclosure参数:

func combineWith(a : Bool, b : Bool, combine: (Bool, () -> Bool) -> Bool) -> Bool {
    return combine(a, { b })
}

let result = combineWith(false, true, { $0 || $1() } )

或者你没有短路行为:

func combineWith(a : Bool, b : Bool, combine: (Bool, Bool) -> Bool) -> Bool {
    return combine(a, b)
}

let result = combineWith(false, true, { $0 || $1 } )