2016-11-29 3 views
3

Der Code unten gezeigt:Warum funktioniert Int (false) aber Int (booleanVariable) nicht?

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)' 

jemand diese Tatsache erklären kann? Es ist verwirrend. Was passiert drinnen?

+2

Dies ist nicht in swift 3. – Dili

+1

Ich glaube nicht, dass es doppelt ist, ist die Frage "warum", nicht "wie". Der Titel der Frage sollte bearbeitet werden. –

Antwort

4

Um herauszufinden, was mit Int(false) los ist, ändern Sie ihn auf:

Int.init(false) 

und dann Option -Klick auf init. Sie werden sehen, dass es diese initializer ruft:

init(_ number: NSNumber) 

Seit false ist ein gültiger NSNumber und NSNumber entspricht dem Protokoll ExpressibleByBooleanLiteral, Swift findet diese initializer.

Warum also nicht diese Arbeit ?:

let emptyString = false 
Int(emptyString) 

Weil jetzt Sie übergeben eine Bool eingegeben Variable und Int keinen Initialisierer haben, die eine Bool nimmt.

In Swift 2 hätte dies funktioniert, weil Bool wurde automatisch überbrückt NSNumber, aber das wurde entfernt.

Sie können es wie folgt erzwingen:

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

Dies funktioniert nur, wenn Stiftung importiert wird. In Pure Swift gibt es natürlich keine NSNumber.

+2

Vielleicht hinzufügen, dass dies erfordert Foundation enthalten sein, "Int (false)" wird nicht kompilieren in reinen Swift-Umgebung. –

+1

Danke!Es ist eine gute Antwort :) –

+0

@MartinR, über eine 'Foundation' Frage - Ich kann dies in swift Spielplatz mit 'importieren UIKit' –

0

diese wollen versuchen

let intValue = emptyString ? 1 : 0 

aktualisieren

Sie Int() verwenden, benutzen Sie diese

Int(NSNumber(value:emptyString)) 
+3

Ja, das weiß ich, danke. Aber mein Interesse ist, die Tatsache in meiner Frage zu verstehen :) –

+0

Cool. Sie können nicht int in bool wie das konvertieren, wenn Sie konvertieren müssen in NSNumber hoffe das hilft – Dili

+0

Aber warum kann ich 'falsch' oder 'wahr' von Int (falsch) konvertieren? –

0

Int nicht über initialiser mit Bool als Argument.

0

Sind Sie sicher, dass Sie so etwas wie diese irgendwo in Ihrer Code-Basis nicht haben:

extension Int : ExpressibleByBooleanLiteral { 
    public init(booleanLiteral: BooleanLiteralType) { 
     self = booleanLiteral ? 1 : 0 
    } 
} 

Weil sonst sollte die Zeile wie let foo = Int(false) nicht kompilieren.

Verwandte Themen