LoginSignup
9
9

More than 5 years have passed since last update.

Swiftで色定義する場合のパターン提案

Last updated at Posted at 2016-05-11

アプリ内で使う色を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にしています。

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9