G. Veronika G. Veronika - 10 days ago 8
Swift Question

Why does Int(false) work but Int(booleanVariable) does not?

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 happens inside?

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 and NSNumber conforms to the protocol ExpressibleByBooleanLiteral, 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 import UIKit or import Cocoa
Int(emtpyString as NSNumber)

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