web-dev-qa-db-fra.com

"'init' est obsolète" avertissement après la conversion de Swift4

Dans Swift3, j'ai précédemment converti un Bool en Int en utilisant la méthode suivante

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

Après la conversion en Swift4, je reçois un avertissement "'init' est obsolète". Comment cela devrait-il être fait autrement?

15
D. Cohen

Avec Swift 4.2 et Swift 5, vous pouvez choisir l'une des 5 solutions suivantes afin de résoudre votre problème).


#1. Utilisation de la propriété NSNumber de intValue

import Foundation

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

# 2. Utilisation de la fonte de type

import Foundation

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

# 3. Utilisation de Intinit(exactly:) initializer

import Foundation

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

Comme alternative au code précédent, vous pouvez utiliser le code plus concis ci-dessous.

import Foundation

let integer = Int(exactly: false)
print(String(describing: integer)) // prints Optional(0)

# 4. Utilisation de Intinit(truncating:) initializer

import Foundation

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

# 5. Utilisation du flux de contrôle

Notez que les exemples de codes suivants ne nécessitent pas d'importer Foundation.

Utilisation # 1 (instruction if):

let integer: Int
let bool = false

if bool {
    integer = 1
} else {
    integer = 0
}
print(integer) // prints 0

Utilisation # 2 (opérateur ternaire):

let integer = false ? 1 : 0
print(integer) // prints 0
21
Imanou Petit

Vous pouvez utiliser la propriété NSNumber intValue:

let x = NSNumber(value: false).intValue

Vous pouvez également utiliser init?(exactly number: NSNumber) initializer:

let y = Int(exactly: NSNumber(value: false))

ou comme mentionné dans les commentaires de @Hamish, l'initialiseur numérique a été renommé init(truncating:)

let z = Int(truncating: NSNumber(value: false))

ou laissez Xcode créer implicitement un NSNumber comme mentionné par @MartinR

let z = Int(truncating: false)

Une autre option que vous avez est d'étendre le protocole BinaryInteger (Swift 4) ou Integer (Swift3) et de créer votre propre initialiseur non faillible qui prend un Bool en paramètre et renvoie le type d'origine en utilisant l'opérateur ternaire comme suggéré dans les commentaires de @vadian:

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