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

问题描述:

显然必须有一种方法来进行AND或OR多个布尔运算。Swift Error:二进制运算符'&&'不能应用于两个'Bool'操作数

我得到这个错误尝试写这样的功能...

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 
} 

有什么解决办法吗?

+9

您在函数签名中缺少返回类型'... - > Bool'。 (这个错误有点令人误解:但是没有指定返回类型,函数需要返回类型'()'(空元组),而你返回一个布尔值)。 – dfri

的错误是误导性的:核心是,你缺失的返回类型... -> Bool在你的函数的签名,因此试图一个布尔值分配到空的元组类型()(没有明确的返回类型,该函数返回为空元组类型())。

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

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

,如果你换你和/或操作在一个封闭或简单地将它们分配到中间布尔变量反之,你失去的混淆错误信息并呈现实际的错误。

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抛出所招致的“外部”无效分配从Bool类型()错误,但该错误引发(“二进制运算'&&'不能应用...“)不是&&调用失败的实际源。

为了验证,我们可以实现我们自己的非懒惰和运营商,说&&&,并如市场预期,我们没有收到同样的模糊处理错误:当对方的回答有一些非常

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 '()' */ 
+3

这个答案应该被接受。这个错误信息在'Swift 2'中是误导性的,希望它能在未来的版本中修复,就像之前的误导性块相关的错误。 –

+3

在Swift 3中依然如此 –

有趣的一点是,在这种特殊情况下,向函数添加返回类型可以解决这个问题。

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(延迟计算)。