Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Int(false) work but Int(booleanVariable) does not? [duplicate]

Tags:

swift

swift3

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?

like image 943
G. Veronika Avatar asked Nov 29 '16 13:11

G. Veronika


1 Answers

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.

like image 88
vacawama Avatar answered Nov 15 '22 10:11

vacawama