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
}
有什么解决办法吗?
的错误是误导性的:核心是,你缺失的返回类型... -> 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 '()' */
这个答案应该被接受。这个错误信息在'Swift 2'中是误导性的,希望它能在未来的版本中修复,就像之前的误导性块相关的错误。 –
在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
(延迟计算)。
您在函数签名中缺少返回类型'... - > Bool'。 (这个错误有点令人误解:但是没有指定返回类型,函数需要返回类型'()'(空元组),而你返回一个布尔值)。 – dfri