2016-10-25 39 views
15

スウィフト2からスウィフト3に変換していました。私はスウィフト3:\でブール値を整数値に変換できないことに気付きました。例えばスウィフト3でブール値をInteger値に変換する

let p1 = ("a" == "a") //true 

print(true)   //"true\n" 
print(p1)    //"true\n" 

Int(true)    //1 

Int(p1)    //error 

これらの構文は、SWIFT 2にうまく働いた。しかし、SWIFT 3に、print(p1)はエラーを生成します。

エラーはエラーが起こっている理由を私は理解してerror: cannot invoke initializer for type 'Int' with an argument list of type '((Bool))'

です。誰もがこの安全性の理由とBoolからIntに迅速に変換する理由を説明できますか?

+0

スウィフト4の場合は、同様の質問に対する私の[受け入れ答えを](https://stackoverflow.com/a/44423340/1966109)を参照してください。 –

答えて

14

あなたは

print(true)   //"true\n" 
print(p1)    //"true\n" 

Int(true)    //1 

Int(NSNumber(value:p1)) //1 
27

あなたはintにブール値に変換する三項演算子を使用することができます。

let result = condition ? 1 : 0 

resultconditionがtrueの場合、0がconditionであることは偽である1になります。

+1

これで、ブール値から整数値へのキャストは迅速に行われません3。 –

+0

@S_karうん、それは削除されました。正式な理由はわかりませんが、Swiftチームはすでに、標準ライブラリから "暗黙的/非明瞭な"型変換を取り除こうとしていると述べています。このBoolからIntへの変換はこのカテゴリに分類されます。 – Moritz

+2

私はこの変換が本当にスウィフトの一部であったとは思わない。 NSNumberによる暗黙的な変換の副作用だと私は信じています。暗黙のBool/Int変換は、Cのバグの古いソースです(特に、 "2"のような非ゼロの数字は "true-ish"ですが、 "true"と等しくないため)。 Swiftはこれらの歴史的なバグの原因を避けようと積極的に試みました。 –

6

EDIT - コメント内の会話から、これを行う第2の方法(Int.init overload)は、Swiftが向いているスタイルのほうがはっきりしています。

また、これがアプリで多忙なものだった場合は、プロトコルを作成して、変換する必要のある各タイプをIntに拡張することができます。

extension Bool: IntValue { 
    func intValue() -> Int { 
     if self { 
      return 1 
     } 
     return 0 
    } 
} 

protocol IntValue { 
    func intValue() -> Int 
} 

print("\(true.intValue())") //prints "1" 

編集 - 以下のコメントにロブ・ネイピアで言及した場合の例をカバーするためには、このような何かを行うことができます:

extension Int { 
    init(_ bool:Bool) { 
     self = bool ? 1 : 0 
    } 
} 

let myBool = true 
print("Integer value of \(myBool) is \(Int(myBool)).") 
+0

また、@ eric-ayaの三項演算の推奨とプロトコルを組み合わせて、簡潔にすることもできます。 – diatrevolo

+0

このアプローチは、コアSwiftチームによって一般的に推奨されていません。全幅変換を実行するメソッドではなく、 'Int.init'オーバーロードをお勧めします。 –

+0

@ Rob-napierにその旨を読むことができる文書はありますか?私はそれがなぜ落胆したのか、その決定につながる議論についてもっと知りたいと思います。 – diatrevolo

4

、これを試してみてください使用できる可能性がありますhashValueプロパティ:

私からしようとして
1

少し:

extension Bool { 
    var intValue: Int { 
     return self ? 1 : 0 
    } 
} 
+1

これは私の好みの解決策ですが、他の解決策よりもスウィフトの慣習に従っています。 – user3225395

関連する問題