显然必须有一种方法可以使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
}
这是什么解决方案?
答案 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
(懒惰评估)。