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.