Swift Error:二元运算符'&&'不能应用于两个'Bool'操作数

时间:2016-01-23 18:42:07

标签: swift

显然必须有一种方法可以使AND或OR多个布尔值。

我在尝试编写像这样的函数时遇到此错误...

func isLocationWithinView(location: CGPoint, view: UIView) {
    //        return (location.x >= CGRectGetMinX(view.frame)) && (location.x <= CGRectGetMaxX(view.frame)) && (location.y >= CGRectGetMinY(view.frame)) && (location.y <= CGRectGetMaxY(view.frame))
    var a = true
    var b = false
    return a && b // Error: Binary operator '&&' cannot be applied to two 'Bool' operands
}

这是什么解决方案?

2 个答案:

答案 0 :(得分:52)

该错误具有误导性:核心是您在函数签名中缺少返回类型... -> Bool,因此尝试为空元组类型()分配布尔值(没有明确的返回类型,函数期望返回为空元组类型())。

对于任何将布尔值赋值为非布尔类型的尝试,您可以重现此误导性错误,其中布尔值是在与无效赋值相同的表达式中执行的逻辑AND / OR表达式的结果: / p>

var a : () = (true && false)    /* same error */
var b : Int = (true && false)   /* same error */
var c : () = (true || false)    /* same error (for binary op. '||') */

如果您将AND / OR操作包装在一个闭包中或者只是将它们分配给一个中间的布尔变量,那么您将丢失混淆的错误消息并显示实际错误。

var d : () = { _ -> Bool in return (true && false) }()
    /* Cannot convert call result type 'Bool' to expected type '()' */
var e = true && false
var f : () = e
    /* Cannot convert value of type 'Bool' to expected type '()' */

现在为什么你给出了这个误导性的错误。逻辑运算符&&||都是通过对其右侧表达式(rhs)进行条件评估来实现的,因此rhs只能在以下情况下进行延迟评估:左侧(lhs)分别对true / false运营商的&& / ||进行评估。

/* e.g. the AND '&&' logical binary infix operator */
func &&(lhs: BooleanType, @autoclosure rhs: () -> BooleanType) -> Bool {
    return lhs.boolValue ? rhs().boolValue : false
}

由于lhs本身对于后面的赋值无效,因此延迟闭包rhs可能会引发&#34;外部&#34;从Bool类型到()的分配无效,但引发的错误(&#34;二元运算&#39; &&&#39;无法应用...& #34; )不是&&电话失败的实际来源。

要验证,我们可以实现我们自己的非惰性AND运算符,比如&&&,并且正如预期的那样,我们不会收到相同的混淆错误:

infix operator &&& {
    associativity right
    precedence 120
}
func &&&(lhs: BooleanType, rhs: BooleanType) -> Bool {
    return lhs.boolValue ? rhs.boolValue : false
}
var g : () = false &&& true
/* Cannot convert value of type 'Bool' to expected type '()' */

答案 1 :(得分:2)

虽然另一个答案有一些非常有趣的点,但在这种特殊情况下,在函数中添加一个返回类型可以解决它。

func isLocationWithinView(location: CGPoint, view: UIView) -> Bool {
    let a = true
    let b = false
    return a && b // Error: Binary operator '&&' cannot be applied to two 'Bool' operands
}

如果true为真,则会返回a,如果不是,则会b(懒惰评估)。