在 swift 中执行组合布尔值

Execution of combined Booleans in swift

我有一个关于计算 属性 的问题,我在其中使用计算布尔值的组合来获得结果。我了解代码背后的逻辑,但我在我的代码中使用了一些打印语句(用于调试),当早期的布尔值之一为假时,这些语句不会被调用。如果 check1 为假,则无需执行 check2 和 check3,因为结果将为假,但我仍想访问该代码中的打印语句。在这里的示例中,我只是检查是否正在访问 var,在我的应用程序中它更复杂,这就是为什么我希望打印出一些逻辑的结果。知道如何解决这个问题吗?所以基本上我很想在调试器中查看所有调用的结果,无论结果是真还是假。

var checkedIsTrue: Bool {
    
    var check1: Bool {
        print("checked 1")
        return 2 < 1 ? true : false // When false, check2 and check3 are not executed
    }
    
    var check2: Bool {
        print("checked 2")
        return 3 < 4 ? true : false
    }
    
    var check3: Bool {
        print("checked 3")
        return 4 < 5 ? true : false
    }
    
    if check1 && check2 && check3 {
        return true
    } else {
        return false
    }
}

print(checkedIsTrue ? "check is OK" : "check is NOK")

&& 是一个“short-circuiting”运算符:如果左操作数为假,则根本不会计算右操作数。

如果您希望(出于调试目的)计算所有布尔表达式,这里有两个可能的选项。

选项 1: 在组合之前创建一个包含所有布尔结果的数组:

if [check1, check2, check3].allSatisfy({ [=10=] }) { ... }

选项 2: 定义你自己的“逻辑与”运算符,它不 short-circuit:

infix operator &&&: LogicalConjunctionPrecedence

extension Bool {
    static func &&&(left: Bool, right: Bool) -> Bool {
        left && right
    }
}

if check1 &&& check2 &&& check3 { ... }

可能有更多方法可以实现这一点。