アプリ内で使う色をEnumerationやStructureで一元管理したい欲求ありますよね。
その定義の仕方について、良さそうなパターンが見つかったので、共有します。
もちろん方法は他にも沢山あるので、こっちの方が良いよ!などあれば教えてください。
import UIKit
public struct XXXColor { // (1)
public enum Common: UInt32, XXXColorEnum { // (3)
case text = 0x333333FF
}
public enum OrderList: UInt32, XXXColorEnum {
case background = 0xEFEFF4FF
}
}
public protocol XXXColorEnum { // (2)
var rawValue: UInt32 { get }
}
extension XXXColorEnum {
public final var color: UIColor {
return UIColor(hex: self.rawValue)
}
}
extension UIColor {
/// 0x1166AAFF
internal convenience init(hex: UInt32) { // (4)
let divisor = CGFloat(255)
let red = CGFloat((hex & 0xFF000000) >> 24) / divisor
let green = CGFloat((hex & 0x00FF0000) >> 16) / divisor
let blue = CGFloat((hex & 0x0000FF00) >> 8) / divisor
let alpha = CGFloat( hex & 0x000000FF ) / divisor
self.init(red: red, green: green, blue: blue, alpha: alpha)
}
}
(1) XXXColor
- 用途ごとに1階層設けるためstructをトップに持ってきています。
- UIColorの独自定義ということでSwiftですが3文字接頭辞つけています。まあColorでもどっちでも良いです。
(2) XXXColorEnum
Enumの色定義に対して、
print(XXXColor.Common.text.color)
と繋げればUIColorが返されるように、プロトコル拡張を使っています。
(3) UInt32で色定義
16進数でUInt32を指定していけば色定義できるようにしています。
UIColor(...
と毎回指定するのだるいですよね。
(4) 8桁UInt32をUIColorに変換するためのconvenience init
念のためテスト書きたいのでinternalにしています。