2015-01-01 10 views
7
convenience init(red:Int,green:Int,blue:Int,alpha:CGFloat) { 
    var red: CGFloat = CGFloat(red)/255.0 
    var green: CGFloat = CGFloat(green)/255.0 
    var blue: CGFloat = CGFloat(blue)/255.0 
    self.init(red:red, green:green, blue:blue, alpha:alpha) 
} 

Ho scritto il codice sopra per dare un modo più comodo di dichiarare il mio uicolore personalizzato. Ma in qualche modo, si blocca la mia app chiamando se stessa fino allo stack overflow. Cosa c'è di sbagliato qui?UIColor estensione convenienza init non funziona

Inoltre, ho appena realizzato che non sto chiamando esplicitamente questa funzione di init. Ma piuttosto stavo chiamando UIColor.whiteColor() quando si verifica questo errore. Ovviamente, se richiamo esplicitamente questa funzione, l'errore si verifica ancora!

risposta

14

non vedo alcun inconveniente facendo proprio come questo:

let myCustomColorHSBa = UIColor(hue: 120/360, saturation: 0.25 , brightness: 1.0 , alpha: 1) 
let myCustomColorRGBa = UIColor(red: 191/255, green: 1, blue: 191/255, alpha: 1) 

ma se si ha realmente bisogno di uno, si può fare come segue:

extension UIColor { 
    convenience init(red: Int = 0, green: Int = 0, blue: Int = 0, opacity: Int = 255) { 
     precondition(0...255 ~= red && 
        0...255 ~= green && 
        0...255 ~= blue && 
        0...255 ~= opacity, "input range is out of range 0...255") 
     self.init(red: CGFloat(red)/255, green: CGFloat(green)/255, blue: CGFloat(blue)/255, alpha: CGFloat(opacity)/255) 
    } 
} 

UIColor(red: 255)    // r 1.0 g 0.0 b 0.0 a 1.0 (Red) 
UIColor(red: 255, green: 255) // r 1.0 g 1.0 b 0.0 a 1.0 (Yellow) 
UIColor(red: 255, blue: 255) // r 1.0 g 0.0 b 1.0 a 1.0 (Magenta) 

UIColor(green: 255)    // r 0.0 g 1.0 b 0.0 a 1.0 (Green) 
UIColor(green: 255, blue: 255) // r 0.0 g 1.0 b 1.0 a 1.0 (Cyan) 

UIColor(blue: 255)    // r 0.0 g 0.0 b 1.0 a 1.0 (Blue) 
UIColor(red: 255, green: 192, blue: 203) // r 1.0 g 0.753 b 0.796 a 1.0 (Pink) 
UIColor(red: 255, green: 215) // r 1.0 g 0.843 b 0.0 a 1.0 (Gold) 
+2

Il trucco qui è che l'init di convenienza deve avere parametri con nomi diversi per l'init UIColor. –

+0

Dopo un po 'di tentativi, penso che Robert Wagstaff abbia dato la giusta spiegazione. Non penso che Swift consenta il sovraccarico di diversi tipi di parametri uguali. Mi chiedo se è stato fatto deliberatamente o sarà permesso in futuro – donkey

+0

Mi aspettavo delle buone risposte su molte delle mie domande se questo ti infastidisce del tutto. – donkey

2

Un altro modo sarebbe quello di farlo in questo modo (swift 3)

extension UIColor { 

    convenience init(r: CGFloat, g: CGFloat, b: CGFloat, a:CGFloat) { 
     self.init(red: r/255, green: g/255, blue: b/255, alpha: a/255) 
    } 
} 

let myColor = UIColor(r:255, g:255, b:255, a:255) 
Problemi correlati