2016-11-29 7 views
3

以下のコード:なぜInt(false)は動作しますが、Int(booleanVariable)は機能しませんか?

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

誰もがこの事実を説明できますか?ややこしい。内部はどうなるの?

+2

これは速やかな3では認められていません。 – Dili

+1

私はそれが重複しているとは思わないが、質問は「方法」ではなく「なぜ」である。質問のタイトルは編集する必要があります。 –

答えて

4

Int(false)で何が起こっているのを確認し、それを変更するには:

Int.init(false) 

、その後initオプション +クリック。 falseが有効NSNumberで、NSNumberはスウィフトは、この初期化子を見つけプロトコルExpressibleByBooleanLiteral、に準拠しているので

init(_ number: NSNumber) 

:あなたは、それは、この初期化子を呼び出していることがわかります。

は、だから今、あなたが渡しているBoolは変数ではない、この作品?:

let emptyString = false 
Int(emptyString) 

型付けされない理由なのでとIntBoolかかる初期化子を持っていません。

スウィフト2では、Boolが自動的にNSNumberにブリッジされていたが、これは削除されていたため、これはうまくいっただろう。

あなたはこのようにそれを強制することができます

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

財団がインポートされている場合のみ有効です。 Pure Swiftにはもちろん、NSNumberはありません。

+2

おそらくこれにFoundationを組み込む必要があると付け加えます。純粋なSwift環境では 'Int(false)'はコンパイルされません。 –

+1

ありがとう!それは素晴らしい答えです:) –

+0

@MartinR、 '財団'の質問 - 私は 'import UIKit'を使って素早く遊び場でこれをコンパイルすることができます –

0

は)あなたがintを(使用したい

更新この

let intValue = emptyString ? 1 : 0 

を試してみて、引数としてBoolで初期化子を持っていないこの

Int(NSNumber(value:emptyString)) 
+3

はい、私はこれについて知っています、ありがとうございます。しかし、私の興味は、私の質問で事実を理解することです:) –

+0

クール。このようにNSNumberに変換する必要がある場合、intをboolに変換することはできません。 – Dili

+0

なぜInt(false)で 'false'または 'true'を変換できますか? –

0

Intを使用しています。それ以外の場合は、let foo = Int(false)ような行がコンパイルべきではありませんので

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

0

は、あなたがあなたのコードベースでは、このどこかのようなものを持っていないことを確認されています。

関連する問題