我正在尝试进行多次检查,将结果累积到一个Bool
:
我的代码是:
var validParams = login.characters.count > 4;
validParams &= password.characters.count > 6;
validParams &= ...
// more validations
if (validParams) {...}
但是我得到错误Binary operator '&=' cannot be applied to two 'Bool' operands
.
如何完成这项工作或在非详细模式下重写此代码?
&=
是按位运算,只能应用于整数类型。&&=
您需要的实际上并不存在,因为短路。你需要写
validParams = validParams && ...
正如@JeremyP所说,&=
是就地按位 AND 运算符,它只对整数类型进行操作。但是,没有什么可以阻止您为就地逻辑 AND 操作定义自己的&&=
运算符:
infix operator &&= : AssignmentPrecedence
func &&=(lhs: inout Bool, rhs: @autoclosure () -> Bool) {
// although it looks like we're always evaluating rhs here, the expression "rhs()" is
// actually getting wrapped in a closure, as the rhs of && is @autoclosure.
lhs = lhs && rhs()
}
然后,您可以像这样简单地使用它:
func someExpensiveFunc() -> Bool {
// ...
print("some expensive func called")
return false
}
var b = false
b &&= someExpensiveFunc() // someExpensiveFunc() not called, as (false && x) == false.
print(b) // false
b = true
b &&= someExpensiveFunc() // someExpensiveFunc() called, as (true && x) == x
print(b) // false
如您所见,由于我们将&&=
的rhs:
参数设为@autoclosure
参数,因此我们可以在lhs
false
时进行短路评估。