In Swift 2.x私はできると信じています:
let number = 1
let result = Bool(number)
print(result) // prints out: true
しかし、Swift 3なので、これを行うことができず、エラーが発生します。
型 '(Int)'の引数リストで型 'Bool'の初期化子を呼び出すことはできません
現在、Int
をBool
に変換するために拡張機能を使用していますが、これを行うための組み込みオプションがないかどうか疑問に思っていました。
いいえ、Int
をBool
に変換するための明示的な組み込みオプションはありません。詳細は、 詳細は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
_
extension Int {
var boolValue: Bool { return self != 0 }
}
extension Integer {
var boolValue: Bool { return self != 0 }
}
let number = 2
print(number.boolValue)
let items = ["1"]
print(items.count.boolValue)
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)
}
}
Xcode 9.0.1とSwift 3.0を使用しています。
let result = (number as NSNumber).boolValue
私にとっては非常にうまく機能しています。
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