2015-01-01 11 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) 
} 

私は上記のコードを書いて、私のカスタムのuicolorを宣言するより便利な方法を与えました。しかし、どういうわけか、スタックオーバーフローまで自分自身を呼び出すことによって私のアプリをクラッシュさせる。ここで何が間違っていますか?UIColor拡張の便利な初期化が動作しない

また、私はこのinit関数を明示的に呼び出さないことに気付きました。しかし、むしろ私はこのエラーが発生したときUIColor.whiteColor()と呼んでいました。もちろん、私がこの関数を明示的に呼び出すと、エラーはまだ発生します!

答えて

14

私はどんな不都合がちょうどこのようにそれをやって表示されていない。

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) 

しかし、あなたは本当に1が必要な場合は、次のように行うことができます。

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

便利なinitは、UIColor initとは異なる名前のパラメータを持つ必要があります。 –

+0

ちょっと試してみたら、Robert Wagstaffが正しい説明をしたと思います。私はSwiftが異なるタイプの同じパラメータを多重定義できるとは思わない。それが意図的に行われたのか、それとも将来的に許されるのかが分かりました – donkey

+0

私は、あなたのことをまったく気にするだけで、たくさんの質問で良い答えを期待していました。 – donkey

2

もう一つの方法は、このようにすることです(スイフト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) 
関連する問題