二元运算符 '&=' 不能应用于 Swift 中的两个 'Bool' 操作数



我正在尝试进行多次检查,将结果累积到一个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参数,因此我们可以在lhsfalse时进行短路评估。

相关内容

最新更新