ios - programming - swift(lenguaje de programación)



Inicializador de UIColor de Swift: error del compilador solo cuando se dirige a iPhone5s (2)

Probablemente tiene que ver con una falta de coincidencia entre Float y Double. Básicamente, si se espera que los argumentos sean CGFloats, debe pasar CGFloats.

let color = UIColor(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: CGFloat(alpha))

Lo que es importante entender aquí es que CGFloat se define como Flotante en plataformas de 32 bits y Doble en plataformas de 64 bits. Por lo tanto, si está utilizando explícitamente Floats, Swift no tendrá un problema con esto en las plataformas de 32 bits, pero producirá un error en 64 bits.

La situación:

Trabajando desde un nuevo proyecto: iOS> Aplicación> Juego> SpriteKit, Swift, iPhone

Aquí he escrito una función en mi GameScene.swift para aceptar un valor de color hexadecimal y un doble alfa. Estoy siguiendo la documentación de Swift y haciendo referencia a una solución elegante que vi en línea. He notado que este código exacto compila, ejecuta y muestra el color adecuado para un objetivo de compilación de iPhone5 en el simulador.

Pero...

El mismo proyecto exacto ni siquiera se compilará cuando mi objetivo de compilación esté configurado para iPhone5s .

No se pudo encontrar una sobrecarga para 'init' que acepte los argumentos proporcionados.

La función:

// colorize function takes HEX and Alpha converts then returns aUIColor object
func colorize (hex: Int, alpha: Double = 1.0) -> UIColor {
    let red = Double((hex & 0xFF0000) >> 16) / 255.0
    let green = Double((hex & 0xFF00) >> 8) / 255.0
    let blue = Double((hex & 0xFF)) / 255.0
    var color: UIColor = UIColor( red: Float(red), green: Float(green), blue: Float(blue), alpha:Float(alpha) )
    return color
}

La llamada relacionada en didMoveToView :

override func didMoveToView(view: SKView) {

    // blue background color
    self.backgroundColor = colorize( 0x003342, alpha:1.0)

}

Es cierto que soy muy nuevo en el desarrollo de iOS, pero me pregunto qué va a hacer para que el compilador no encuentre este inicializador.

EDITAR: poner un github momentáneamente

Un resumen rápido con archivos relacionados ... el único que he editado es GameScene.swift


Answer #1

Vea en el código fuente que debe usar CGFloat en lugar de Float

Esto debería funcionar

func colorize (hex: Int, alpha: Double = 1.0) -> UIColor {
    let red = Double((hex & 0xFF0000) >> 16) / 255.0
    let green = Double((hex & 0xFF00) >> 8) / 255.0
    let blue = Double((hex & 0xFF)) / 255.0
    var color: UIColor = UIColor( red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha:CGFloat(alpha) )
    return color
}