UIColor扩展方便初始化未能正常工作

9
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。但不知何故,它会无限递归调用自身,直到堆栈溢出导致我的应用程序崩溃。这里出了什么问题?
另外,我刚刚意识到我没有显式调用这个init函数。而是在发生错误时调用了UIColor.whiteColor()。当然,如果我显式调用此函数,错误仍会发生!
2个回答

22

我认为这样做没有任何不便之处:

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)

但如果你真的需要一个,你可以按照以下步骤操作:

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)

4
这里的诀窍是,convenience init 方法必须具有与 UIColor init 方法不同的参数名称。 - Robert Wagstaff
1
经过一番尝试,我认为Robert Wagstaff给出了正确的解释。我不认为Swift允许重载相同参数的不同类型。不知道这是故意的还是将来会被允许。 - donkey
如果这让你不舒服的话,我只是期望在我的很多问题上得到好的答案。 - donkey

4

另一种方式是这样做(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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接