iOS의 UIColor의 생성자 중, RGB값을 사용하는 생성자는 다음과 같다.
init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) // 참고 : https://developer.apple.com/documentation/uikit/uicolor/1621925-init
각 색상값들의 변수형이 CGFloat인 이유는, 0 ~ 1.0 사이의 값으로 지정하게 되어 있기 때문이다.
하지만 개발업무에서 대부분의 색상값 전달은 hex 혹은 int를 사용하다보니, 애초에 iOS 용도로 나온 안내가 아니라면 불편한 경우가 많다. 사실, 따져보면 iOS도 최소한 driver 수준에서는 정수를 사용하고 있을텐데.
어쨌든, 이번에도 designer들에게 전달받은 색상값이 전부 정수로 되어있다보니, 이걸 공통함수화 하겠다는 commit이 올라왔다.
func UICOLOR_RGB(_ r: CGFloat, _ g: CGFloat, _ b: CGFloat) -> UIColor {
return UIColor.init(red: r/255, green: g/255, blue: b/255, alpha: 1)
}
함수명을 대문자로 한 이유는 “UICOLOR 값 세팅이기 때문에 함수명을 대문자로 작성” 이라고 한다.
이건 기존에 명명규칙 등을 정의한 개발안내서를 참고하라는 이야기와 함께 기각.
Extension을 쓰는 게 낫지 않겠느냐는 이야기엔...”그게 더 번거로울 거 같아서”라고.
이건 가능하면 extension으로 생성자 추가하는 게 나을거라는 이야기는 했지만, 선택은 본인 몫이니 알아서 하라고 했다.
매개변수를 실수가 아니라 int처럼 정수 계열로 하는 게 낫겠다는 건...납득은 못한 분위기다.
그래서 이건 꼭 바꿔야 한다고 기각했고, 곧 “float가 아니라 int면 나누기가 안됩니다. 제가 뭘 못하는건지 계산 값이 제대로 이루어지지않아 검정색으로 나옵니다(0으로 처리) 그래서 CGFloat으로 두었습니다. 해결방법있으면 알려주세요~” 라고 한다.
.......순간 암담했지만, 말로 쓰기보단 type casting 관련 link를 보내줬다.
해당 PR에는 아래와 같은 예제 구문을 남겨두었다.
extension UIColor {
convenience init(_ r: UInt8, _ g: UInt8, _ b: Uint8, _ a: UInt8=255) {
self.init(red:CGFloat(r) / 255.0, green:CGFloat(g) / 255.0, blue:CGFloat(b) / 255.0, alpha: CGFloat(a) / 255.0)
}
}
일단 변수형을 UInt8로 제한했다. 아래 생성자 구문에서 볼 수 있다시피, 각 값은 0 ~ 255의 범위를 갖는 RGB888 체계를 사용한다고 가정했기 때문이다. 표현값의 범위가 UInt8과 정확히 일치하기 때문에, 변수형을 제한시켜두면 compile time에서 잘못된 값을 넣는 걸 방지할 수 있다.
마지막 alpha에는 기본값을 255로 넣어두어, 필요한 경우 생략해서 사용할 수 있게 했다.
그리고 extension으로 생성자를 추가했기 때문에, 보다 더 직관적으로 사용할 수 있지 않을까?
하지만 이 사진구문이 사용되는 일은 없었다.
대신 올라온 code가 어떤지, 그냥 기록 삼아 남겨두자......
func UIColor_RGB(_ r: Int, _ g: Int, _ b: Int) -> UIColor {
let red: CGFloat(r)
let green: CGFloat(g)
let blue: CGFloat(b)
return UIColor.init(red: red/255, green: green/255, blue: blue/255, alpha: 1)
}