web-dev-qa-db-ja.com

IntからBoolへの変換

In Swift 2.x私はできると信じています:

let number = 1
let result = Bool(number)

print(result) // prints out: true

しかし、Swift 3なので、これを行うことができず、エラーが発生します。

型 '(Int)'の引数リストで型 'Bool'の初期化子を呼び出すことはできません

現在、IntBoolに変換するために拡張機能を使用していますが、これを行うための組み込みオプションがないかどうか疑問に思っていました。

27
Henny Lee

いいえ、IntBoolに変換するための明示的な組み込みオプションはありません。詳細は、 詳細はBoolの言語リファレンス を参照してください。

ただし、まだ存在します NSNumberによる初期化子 。違いは、Swift数値型とNSNumberの間の暗黙的なブリッジングが、Swift 3(以前は明示的と思われるものを許可していたBool by Int初期化)。NSNumberからIntへの変換を明示的に実行することにより、NSNumber初期化子によってこれにアクセスできます。

_let number = 1
let result = Bool(number as NSNumber)

print(result) // true
_

@Hamishが彼のコメントに以下のように書いているように:初期化子のサブジェクトから離れて、最終結果(Boolインスタンスの値を指定してIntインスタンスをインスタンス化する)に焦点を合わせる場合、単純にInt値に対する_!=_演算子の使用(具体的には、署名func !=(lhs: Int, rhs: Int) -> Boolを持つ演算子)、_!=_演算子アプローチを使用して簡単に達成できる一般化:

_let number = -1
let result = number != 0

print(result) // true
_

あなた自身と同様に @ JALが彼の答えで説明しています と同様に、Bool初期化子によって独自のIntを構築できますが、これを Integerプロトコル に準拠する任意のタイプ:

_extension Bool {
    init<T: Integer>(_ num: T) {
        self.init(num != 0)
    }
}

/* example usage */
let num1: Int8 = -1
let num2: Int = 3
let num3: UInt64 = 0
// ....
let result1 = Bool(num1) // true
let result2 = Bool(num2) // true
let result3 = Bool(num3) // false
_
46
dfri

スイフト4

extension Int {
    var boolValue: Bool { return self != 0 }
}

スイフト3

extension Integer {
    var boolValue: Bool { return self != 0 }
}

使用法

let number = 2
print(number.boolValue)

let items = ["1"]
print(items.count.boolValue)
19
lingchen

Intを取るブール初期化子はなく、NSNumberのみです。以前は、IntはFoundationを介してNSNumberに暗黙的にブリッジされていましたが、Swift 3。

次のようなことができます:

let result = Bool(number as NSNumber)

または、Boolを拡張して、Intを受け取るカスタムinitを作成できます。

extension Bool {    
    init(_ number: Int) {
        self.init(number as NSNumber)
    }
}
6
JAL

Xcode 9.0.1とSwift 3.0を使用しています。

let result = (number as NSNumber).boolValue

私にとっては非常にうまく機能しています。

5
arthankamal
let iFalse: Int = 0
let iTrue: Int = 1
let iNil: Int = 2 //or any number other than 0 & 1

Bool(exactly: iFalse as NSNumber) //false
Bool(exactly: iTrue as NSNumber) //true
Bool(exactly: iNil as NSNumber) //nil
0
Al___