Dans Swift 2.x, je crois que je pourrais faire:
let number = 1
let result = Bool(number)
print(result) // prints out: true
Mais depuis Swift 3, je suis incapable de le faire et cela me donne l’erreur:
Impossible d'appeler l'initialiseur pour le type 'Bool' avec une liste d'arguments de type '(Int)'
Actuellement, j'utilise une extension pour convertir une Int
en une Bool
, mais je me demandais s'il n'y avait pas d'option de génération pour le faire.
Non, il n’existe et n’a jamais eu d’option explicite intégrée pour la conversion de Int
en Bool
, voir la référence de langage pour Bool
pour plus de détails .
Cependant, il existe toujours un initializer de NSNumber
. La différence est que le pontage implicite entre le type numérique Swift et NSNumber
a été supprimé de Swift 3 (ce qui permettait auparavant ce qui semblait être explicite Bool
sur Int
initialization). Vous pouvez toujours accéder à cela en initialisant NSNumber
en effectuant explicitement la conversion de Int
en NSNumber
:
let number = 1
let result = Bool(number as NSNumber)
print(result) // true
Comme @Hamish écrit dans son commentaire ci-dessous: si nous quittons le sujet des initialiseurs et concentrons-nous uniquement sur le résultat final (instanciation d'une instance Bool
à partir de la valeur d'une instance Int
), nous pouvons simplement utiliser l'opérateur !=
pour les valeurs Int
(plus précisément , l'opérateur avec la signature func !=(lhs: Int, rhs: Int) -> Bool
), une généralisation facilement réalisable en utilisant l'approche !=
:
let number = -1
let result = number != 0
print(result) // true
Tout comme vous le décrivez vous-même ainsi que @JAL dans sa réponse , vous pouvez construire votre propre initialiseur Bool
par Int
, mais vous pouvez également envisager de généraliser ceci pour tout type conforme au protocole 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)
Il n'y a pas d'initialiseur booléen prenant une Int
, seulement NSNumber
. Auparavant, la Int
était implicitement pontée en NSNumber
par le biais de Foundation, mais cela a été supprimé dans Swift 3.
Vous pouvez faire quelque chose comme:
let result = Bool(number as NSNumber)
Ou, vous pouvez étendre Bool
et créer un init personnalisé qui prend un Int:
extension Bool {
init(_ number: Int) {
self.init(number as NSNumber)
}
}
J'utilise Xcode 9.0.1 et Swift 3.0.
let result = (number as NSNumber).boolValue
qui fonctionne très bien pour moi.
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