type the raw not must literal have for enum does cannot swift int boolean swift3

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