2015-01-01 2 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 확장 편의 초기화가 작동하지 않습니다.

또한이 함수를 명시 적으로 호출하지 않는다는 것을 알았습니다. 그러나 오히려 나는이 오류가 발생할 때 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) 

을하지만 당신이 정말로 일을해야하는 경우는 다음과 같이 수행 할 수 있습니다

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) 
관련 문제