web-dev-qa-db-fra.com

Conversion de Int en Bool

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.

22
Henny Lee

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
41
dfri

Swift 4

extension Int {
    var boolValue: Bool { return self != 0 }
}

Swift 3

extension Integer {
    var boolValue: Bool { return self != 0 }
}

Usage

let number = 2
print(number.boolValue)

let items = ["1"]
print(items.count.boolValue)
15
lingchen

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)
    }
}
6
JAL

J'utilise Xcode 9.0.1 et Swift 3.0. 

let result = (number as NSNumber).boolValue

qui fonctionne très bien pour moi.

4
arthankamal
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
0
Al___