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

3

我希望将它们用作我的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个回答

2
如果您在语句中“cmd-click”单词“Swift”
import Swift

在 Xcode 中搜索 ||,你会发现它被声明为:
func ||<T : BooleanType>(lhs: T, rhs: @autoclosure () -> Bool) -> Bool

原因是 || 运算符的“短路行为”:如果第一个操作数为 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中测试的。在Swift 1.2(Xcode 6.3)中,自动闭包参数的语法已更改,我还没有能够将上面的代码翻译成Swift 1.2(请参见下面Rob的评论)。
目前,我能提供的唯一解决方法非常丑陋。您可以将||包装到不具有自动闭包参数的闭包中:
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 } )

这似乎显然是答案(除了你不能像那样在类型中放置@autoclosure)。但它似乎并没有真正起作用。试一下:func f(b: (Bool, () -> Bool) -> Bool) {}; f(&&)。还不确定原因。 - Rob Napier
@RobNapier:我在Xcode 6.1.1上尝试了一下,它可以工作。我认为autoclosure参数的语法在Xcode 6.3中发生了变化,你用的是哪个版本? - Martin R
我在运行6.3版; 如果我放入@autoclosure,它会抱怨它只能与声明一起使用,而不能与类型一起使用。如果我不加它,它会抱怨类型不匹配。(可能这是6.3版中的一个错误。) - Rob Napier
3
我认为这是一个 bug,已经发布到开发者论坛上了。https://devforums.apple.com/message/1105641#1105641 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接