如果您在语句中“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