【问题标题】:Evaluate Bool property of optional object in if statement在 if 语句中评估可选对象的 Bool 属性
【发布时间】:2014-11-13 13:39:45
【问题描述】:

Bool 是可选对象的属性时,我正在寻找一种在单个if 语句中简洁地评估Swift Bool 的方法:

var objectWithBool: ClassWithBool?
// ...

if let obj = objectWithBool {
    if obj.bool {
        // bool == true
    } else {
        // bool == false
    }
} else {
    // objectWithBool == nil
}

有没有办法组合这些if 语句?在 Objective-C 中这很容易做到,因为 nil 对象可以在同一个表达式中求值:

if (objectWithBool.bool) {
    // bool == true
} else {
    // bool == false || objectWithBool == nil
}

【问题讨论】:

    标签: swift boolean evaluation optional


    【解决方案1】:

    啊,找到了:

    if objectWithBool?.bool == true {
        // objectWithBool != nil && bool == true
    } else {
        // objectWithBool == nil || bool == false
    }
    

    可选的链接表达式objectWithBool?.bool 返回一个可选的Bool。由于它是可选的,因此 if 语句中的该表达式将根据可选是否包含值而被评估为 true/false

    通过使用== 运算符,if 语句检查可选项的值,在这种情况下可以是truefalsenil

    【讨论】:

    • 我不会说它“强制评估可选的 Bool”objectWithBool?.bool 可以是 truefalsenil (== Optional<Bool>.None),比较 == true 仅在第一种情况下产生 true
    • @MartinR 是的,我在那里有点仓促。我已经扩展了一些解释 - 希望现在更有意义。
    【解决方案2】:

    另一种可能的解决方案是:

    if objectWithBool?.bool ?? false {
        println("objectWithBool != nil && objectWithBool.bool == true")
    } else {
        println("objectWithBool == nil || objectWithBool.bool == false")
    }
    

    "nil coalescing operator"a ?? b

    的简写
    a != nil ? a! : b
    

    【讨论】:

    • 感谢@MartinR。我喜欢 nil 合并运算符,它可以生成一些非常简洁的代码。我认为这里比用true 检查是否相等要稍微清楚一些,因为乍一看false 的存在可能看起来逻辑是相反的。好主意!
    • @Stuart:这取决于你如何看待它。来自(普通)C,我更喜欢if boolVar {}if boolVar == true {},然后?? false 作为默认值。它对其他类型也同样适用,例如if (myArray?.count ?? 0) > 0。 - 所以这只是个人喜好的问题:)
    • 你是对的,而且我也尽可能喜欢if boolVar {}。我想我的意思是,乍一看可能会让人误以为表达式是用false 来检查equality,这可能会让人感到困惑。当我更习惯于阅读?? 运算符时,我可能会改变主意:)
    【解决方案3】:

    你也可以这样做:

    if let obj = objectWithBool where obj {
        // objectWithBool != nil && obj == true
    } else {
       // objectWithBool == nil || obj == false
    }
    

    【讨论】:

    • 如果您需要在if 块内使用未包装的Bool,这很有用,否则您应该使用if let _ = objectWithBool ... 丢弃变量,或使用其他答案之一。另外,请注意,在 Swift 3 中,语法已更改为 if let obj = objectWithBool, obj { ... } else { ... }
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2010-12-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多