はじめに
HTMLカラーコードの16進数を10進数へ、10進数を16進数へ変換するコードをSwiftで書きます。
今回は、#8a2be2(BlueViolet)を変換していきます。
16進数から10進数
文字列を詳細に解析できるNSScannerクラスを使います。
このクラスは、内部で解析開始位置の情報を持っていて、それを動かしながら文字列を解析していきます。
特定の文字やキャラクタセットを取り出したり、数値解析に関するメソッドを持っています。
let code = "8a2be2"
let scanner = NSScanner(string: code as NSString)
var color:UInt32 = 0
if(scanner.scanHexInt(&color)) {
let r = (color & 0xFF0000) >> 16
let g = (color & 0x00FF00) >> 8
let b = (color & 0x0000FF)
}
実行結果は(r, g, b) = (138, 43, 226)
となります。
10進数から16進数
先ほどの実行結果の(r, g, b) = (138, 43, 226)
を8a2be2
にするためにNSStringのformatを利用します。
%02xとすることで最小フィールド幅未満のとき0で埋めます。
NSString(format: "%02x%02x%02x", r, g, b)
実行結果は8a2be2
となり、もとのHTMLカラーコードと一致します。
最後に
色を管理するUIColorクラスで利用する場合は、(r, g, b)をそれぞれ255.0で割ります。
UIColor(red: CGFloat(r)/255.0, green: CGFloat(g)/255.0, blue: CGFloat(b)/255.0, alpha: 1.0)
UIColorクラスは16進数からUIColorを作成できないため、UIColorクラスを拡張するカテゴリを作成すると便利かもしれません。