【问题标题】:Accessing boolValue in a NSNumber var with optional chaining (in Swift)使用可选链接访问 NSNumber var 中的 boolValue(在 Swift 中)
【发布时间】:2015-02-19 07:49:42
【问题描述】:

我有一个带有可选实例变量的 NSManagedObject 子类

@NSManaged var condition: NSNumber? // This refers to a optional boolean value in the data model

当条件变量存在并包含“真”时,我想做一些事情。

当然,我可以这样做:

if let cond = condition {
 if cond.boolValue {
  // do something
 }
}

但是,我希望可以通过可选链接将同样的事情做得更紧凑一些。像这样的:

if condition?.boolValue {
  // do something
}

但这会产生编译器错误:

可选类型'$T4??'不能用作布尔值;改为测试 '!= nil'

解决这个问题的最简洁的方法是这样的:

if condition != nil && condition!.boolValue {
 // do something
}

真的没有办法通过可选链接访问布尔值,还是我在这里遗漏了什么?

【问题讨论】:

    标签: swift nsnumber optional


    【解决方案1】:

    您可以将其与布尔值进行比较:

    if condition == true {
        ...
    }
    

    一些测试用例:

    var testZero: NSNumber? = 0
    var testOne: NSNumber? = 1
    var testTrue: NSNumber? = true
    var testNil: NSNumber? = nil
    var testInteger: NSNumber? = 10
    
    if testZero == true {
        // not true
    }
    
    if testOne == true {
        // it's true
    }
    
    if testTrue == true {
        // It's true
    }
    
    if testNil == true {
        // not true
    }
    
    if testInteger == true {
        // not true
    }
    

    最有趣的是1被识别为true——这是意料之中的,因为类型是NSNumber

    【讨论】:

    • testNil == true raise fatal error: unexpectedly found nil while unwrapping an Optional value。所以,你应该这样写testNil?.boolValue == true,如果看起来不太好。 :(
    • 我刚刚测试过,它工作正常,没有抛出异常。这是一个可选的,所以不会发生强制展开,所以我想知道你是怎么得到这个错误的。您是否有可能错误地将其声明为隐式展开的可选?
    • 哦,是我的错。使用像 var testNil: NSNumber! = nil 这样的隐式展开可选会引发此错误。很抱歉。
    • 老实说你吓到我了一会儿:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    相关资源
    最近更新 更多