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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With