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

Tôi đã viết mã ở trên để mang lại một cách thuận tiện hơn để khai báo màu tùy chỉnh của tôi. Nhưng bằng cách nào đó, nó bị treo ứng dụng của tôi bằng cách tự gọi nó cho đến khi tràn ngăn xếp. Có gì sai ở đây?Tiện ích mở rộng tiện ích mở rộng UIC init không hoạt động

Ngoài ra, tôi vừa nhận ra rằng tôi không gọi hàm init này một cách rõ ràng. Nhưng thay vào đó tôi đã gọi UIColor.whiteColor() khi lỗi này xảy ra. Tất nhiên, nếu tôi gọi một cách rõ ràng chức năng này, lỗi vẫn xảy ra!

Trả lời

14

Tôi không thấy bất kỳ sự bất tiện làm việc đó như thế này:

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) 

nhưng nếu bạn thực sự cần, bạn có thể làm như sau:

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

Bí quyết ở đây là init tiện dụng phải có các tham số có tên khác với init UIColor. –

+0

Sau một chút cố gắng bản thân mình, tôi nghĩ rằng Robert Wagstaff đã đưa ra lời giải thích đúng. Tôi không nghĩ Swift cho phép quá tải các kiểu tham số khác nhau. Tự hỏi nếu nó được thực hiện cố ý hoặc nó sẽ được cho phép trong tương lai – donkey

+0

Tôi đã chỉ mong đợi câu trả lời tốt về rất nhiều câu hỏi của tôi nếu điều đó làm phiền bạn cả. – donkey

2

Một cách khác là làm như thế này (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) 
Các vấn đề liên quan