swift - the - Convertir Int a Bool
swift 4 enum string (5)
Swift 4
extension Int {
var boolValue: Bool { return self != 0 }
}
Swift 3
extension Integer {
var boolValue: Bool { return self != 0 }
}
Uso
let number = 2
print(number.boolValue)
let items = ["1"]
print(items.count.boolValue)
En Swift 2.x creo que podría hacer:
let number = 1
let result = Bool(number)
print(result) // prints out: true
Pero desde Swift 3 no he podido hacer esto y me da el error:
No se puede invocar el inicializador para el tipo ''Bool'' con una lista de argumentos del tipo ''(Int)''
Actualmente estoy usando una extensión para convertir un Int
en un Bool
pero me preguntaba si no hay una opción de compilación para hacer esto.
Estoy usando Xcode 9.0.1 y Swift 3.0.
let result = (number as NSNumber).boolValue
que está funcionando muy bien para mí.
No hay un inicializador booleano que tome un Int
, solo NSNumber
. Anteriormente, el Int
se NSNumber
implícitamente a NSNumber
través de Foundation, pero eso se eliminó en Swift 3.
Puedes hacer algo como:
let result = Bool(number as NSNumber)
O, puede extender Bool
y crear un inicio personalizado que tome un Int:
extension Bool {
init(_ number: Int) {
self.init(number as NSNumber)
}
}
No, existe y nunca ha habido una opción explícita incorporada para la conversión de Int
a Bool
, consulte la referencia del idioma de Bool
para obtener más información .
Existe, sin embargo, un inicializador por NSNumber
. La diferencia es que el puente implícito entre el tipo numérico Swift y NSNumber
se ha eliminado en Swift 3 (lo que anteriormente permitía lo que parecía ser Bool
explícito por inicialización Int
). Aún puede acceder a esto mediante el inicializador NSNumber
realizando explícitamente la conversión de Int
a NSNumber
:
let number = 1
let result = Bool(number as NSNumber)
print(result) // true
Como @Hamish escribe en su comentario a continuación: si dejamos el tema de los inicializadores y simplemente nos centramos en el resultado final (ejemplificando una instancia de Bool
dado el valor de una instancia de Int
), simplemente podemos utilizar el operador !=
Para los valores de Int
( específicamente, el operador con la firma func !=(lhs: Int, rhs: Int) -> Bool
), una generalización fácilmente alcanzable utilizando el enfoque del operador !=
:
let number = -1
let result = number != 0
print(result) // true
Al igual que usted, así como lo describe @JAL en su respuesta , puede crear su propio inicializador Bool
by Int
, pero también podría considerar generalizar esto para cualquier tipo que se ajuste al protocolo 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
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