Search code examples
swiftoption-typeoptional-chaining

Optional chaining for constructor calls?


I want to optionally cast an NSNumber? to an Int?, but the initialiser method for Int only takes init(NSNumber), so I can't pass an NSNumber?.

Is there a way for me to compact this code so that it uses something like optional chaining?

// number: NSNumber?
let integer = number == nil ? nil : Int(number!)

Solution

  • The Int constructors don't take optional arguments. You could "wrap" the construction into map():

    let number : NSNumber? = ...
    let n = number.map { Int($0) } // `n` is an `Int?`
    

    But here it is easier to use the integerValue property of NSNumber with optional chaining:

    let n = number?.integerValue // `n` is an `Int?`
    

    or just

    let n = number as? Int // `n` is an `Int?`
    

    since Swift "bridges" between NSNumber and Int automatically.