Accessing boolValue in a NSNumber var with optional chaining (in Swift)

nsnumber, option-type, swift

Solution

You can just compare it to a boolean value:

if condition == true {
    ...
}

Some test cases:

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
}

The most interesting thing is that `1` is recognized as `true` - which is expected, because the type is `NSNumber`

Problem

I have a NSManagedObject subclass with an optional instance variable ``` @NSManaged var condition: NSNumber? // This refers to a optional boolean value in the data model ``` I'd like to do something when the condition variable exists and contains 'true'. Of course, I can do it like this: ``` if let cond = condition { if cond.boolValue { // do something } } ``` However, I hoped it would be possible to do the same thing a little bit more compact with optional chaining. Something like this: ``` if condition?.boolValue { // do something } ``` But this produces a compiler error: Optional type '$T4??' cannot be used as a boolean; test for '!= nil' instead The most compact way to solve this problem was this: ``` if condition != nil && condition!.boolValue { // do something } ``` Is there really no way to access the boolean value with optional chaining, or am I missing something here?

Original source