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?
Avec Swift 4.2 et Swift 5, vous pouvez choisir l'une des 5 solutions suivantes afin de résoudre votre problème).
NSNumber
de 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:)
initializerimport 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)
Int
init(truncating:)
initializerimport Foundation
let integer = Int(truncating: false)
print(integer) // prints 0
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
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