type protocol generic for data arc ios swift implicit-conversion primitive-types

generic - protocol ios swift



¿Swift soporta la conversión implícita? (3)

Por ejemplo, tengo el siguiente código:

let numberOfBlocks = 3 let blockWidth = SKSpriteNode(imageNamed: "image.png").size.width let padding = 20.0 let offsetX : Float = (self.frame.size.width - (blockWidth * numberOfBlocks + padding * (numberOfBlocks-1))) / 2

Me salió el error

''Doble'' no es convertible a ''UInt8''

¿Hay una manera de convertir implícitamente el tipo de datos (quizás solo para el tipo de datos primitivo)?

Editar:

Sé cómo hacer la conversión explícita utilizando un constructor de un tipo particular como sugirió Iducool . Pero no es de gran ayuda para mi pregunta porque ni siquiera sabemos dónde agregar las conversiones. Simplifiqué mi expresión en el patio de recreo:

El problema está en la variable "relleno", el mensaje de error es

''Doble'' no es convertible a ''UInt8''.

Así que hice la conversión:

Entonces el problema está en la variable "blockWidth" ahora.

He añadido la conversión de nuevo:

Y el mensaje de error es:

El tipo ''UInt8'' no cumple con el protocolo ''FloatLiteralCovertible''

La expresión de trabajo final es:

¿Es simple y rápido? No lo creo.


No hay un lanzamiento implícito en Swift.

Una forma fácil de conversión en swift es usar un constructor de un tipo particular.

Al igual que si desea obtener Float desde el doble, puede usar Float(doubleValue) y de la misma manera si desea convertir float a entero, puede usar Int(floatValue) .

En tu caso:

let intValue = UInt8(doubleValue)

Tenga en cuenta que perderá cualquier valor después del punto decimal. Por lo tanto, elige una mejor manera. Por encima de la conversión es sólo para ayudarle a comprender.

Tenga en cuenta que Swift siempre elige Doble (en lugar de Flotante) al inferir el tipo de números de punto flotante.


utilizando el método bridgeToObjectiveC () puede llamar a los métodos provistos en Objective - C para convertir de un tipo de datos primitivo a otro para, por ejemplo,

variable_name.bridgeToObjectiveC().intValue

convertirá esa variable llamada variable_name a entero


Swift ya no admite el lanzamiento implícitamente de Xcode6 GM. La siguiente respuesta solo se aplica a la versión beta de Xcode6.

No quiero hablar de que el lanzamiento implícito sea bueno o malo, pero puedes tenerlo si realmente quieres con __conversion()

Por ejemplo, si necesita UInt8 e Int puede convertir de Double

extension Double { func __conversion() -> UInt8 { return UInt8(self) } func __conversion() -> Int { return Int(self) } // add more if you need to }

xcrun swift Welcome to Swift! Type :help for assistance. 1> extension Double { 2. func __conversion() -> UInt8 { return UInt8(self) } 3. } 4> var d = 1.0 d: Double = 1 5> var u8 : UInt8 = d u8: UInt8 = 1 6>

Nota: No pondré esto en mi código de producción. Solo quiero señalarlo si es posible pero no lo recomiendo.