G. Veronika G. Veronika - 6 days ago 6
Swift Question

Swift 3.0. Bool to Int issue

The code shown below:

Int(false) // = 1, it's okay

//but when I try this
let emptyString = true //or let emptyString : Bool = true
Int(emptyString) //error - Cannot invoke initializer with an argument list of type '(Bool)'


Can anyone explain this fact? It's confusing. What am I doing wrong?

Answer

To find out what is going on with Int(false), change it to:

Int.init(false)

and then option-click on init. You will see that it is calling this initializer:

init(_ number: NSNumber)

Since false is a valid NSNumber, Swift finds this initializer.

So why doesn't this work?:

let emptyString = false
Int(emptyString)

Because now you are passing a Bool typed variable and Int doesn't have an initializer that takes a Bool.

In Swift 2 this would have worked because Bool was automatically bridged to NSNumber, but that has been removed.

You can force it like this:

import Foundation // or UIKit or Cocoa
Int(emtpyString as NSNumber)

This only works if Foundation is imported. In Pure Swift there is no NSNumber, of course.

Comments