Swift3では、以前に次の方法を使用してBoolをIntに変換しました
let _ = Int(NSNumber(value: false))
Swift4に変換した後、「 'init' is deprecated」という警告が表示されます。他にどのようにこれを行うべきですか?
Swift 4.2とSwift 5を使用すると、問題を解決するために次の5つのソリューションのいずれかを選択できます。
NSNumber
のintValue
プロパティを使用する_import Foundation
let integer = NSNumber(value: false).intValue
print(integer) // prints 0
_
_import Foundation
let integer = NSNumber(value: false) as? Int
print(String(describing: integer)) // prints Optional(0)
_
Int
の使用 init(exactly:)
初期化子_import Foundation
let integer = Int(exactly: NSNumber(value: false))
print(String(describing: integer)) // prints Optional(0)
_
前のコードの代わりに、以下のより簡潔なコードを使用できます。
_import Foundation
let integer = Int(exactly: false)
print(String(describing: integer)) // prints Optional(0)
_
Int
の使用 init(truncating:)
初期化子_import Foundation
let integer = Int(truncating: false)
print(integer) // prints 0
_
以下のサンプルコードはFoundationをインポートする必要がないことに注意してください。
用途#1(ifステートメント):
_let integer: Int
let bool = false
if bool {
integer = 1
} else {
integer = 0
}
print(integer) // prints 0
_
使用法#2(3項演算子):
_let integer = false ? 1 : 0
print(integer) // prints 0
_
NSNumberプロパティintValueを使用できます。
_let x = NSNumber(value: false).intValue
_
init?(exactly number: NSNumber)
初期化子を使用することもできます:
_let y = Int(exactly: NSNumber(value: false))
_
または、@ Hamishのコメントで述べられているように、数値初期化子はinit(truncating:)
に名前が変更されました
_let z = Int(truncating: NSNumber(value: false))
_
または、@ MartinRで言及されているように、Xcodeから暗黙的にNSNumberを作成します
_let z = Int(truncating: false)
_
プロトコルBinaryInteger(Swift 4)またはInteger(Swift3)を拡張して、ブール値をパラメーターとして受け取り、@ vadianのコメントで提案されている3項演算子を使用して元の型を返す独自の非フォールブル初期化子を作成する方法もあります。
_extension BinaryInteger {
init(_ bool: Bool) {
self = bool ? 1 : 0
}
}
_
_let a = Int(true) // 1
let b = Int(false) // 0
let c = UInt8(true) // 1
let d = UInt8(false) // 0
_