web-dev-qa-db-ja.com

Swift4変換後の「 'init' is deprecated」警告

Swift3では、以前に次の方法を使用してBoolをIntに変換しました

let _ = Int(NSNumber(value: false))

Swift4に変換した後、「 'init' is deprecated」という警告が表示されます。他にどのようにこれを行うべきですか?

15
D. Cohen

Swift 4.2とSwift 5を使用すると、問題を解決するために次の5つのソリューションのいずれかを選択できます。


#1。 NSNumberintValueプロパティを使用する

_import Foundation

let integer = NSNumber(value: false).intValue
print(integer) // prints 0
_

#2。型キャストの使用

_import Foundation

let integer = NSNumber(value: false) as? Int
print(String(describing: integer)) // prints Optional(0)
_

#3。 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)
_

#4。 Intの使用 init(truncating:) 初期化子

_import Foundation

let integer = Int(truncating: false)
print(integer) // prints 0
_

#5。制御フローの使用

以下のサンプルコードは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
_
21
Imanou Petit

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
_
5
Leo Dabus