LoginSignup
9
9

More than 5 years have passed since last update.

Swift で CSS3 の色を名前で参照する方法

Posted at

Swift で CSS3 の色を名前で参照したい

Swift で CSS 3 で使われる色の名前から実際の UIColor または NSColor を取得する CSSColor を紹介します。CSSColor を使えば、W3C の CSS Color Module Level 3 で規定された色の名前を Swift から簡単に利用できるようになります。

色の名前の一覧

let names = CSSColor.colorNames // [String]

色の名前の一覧を配列として得る事ができます。

色の名前から UIColor または NSColor を取得

let color1  = CSSColor.colorNamed("tomato")
let color2  = CSSColor.colorNamed("magenta")

名前がはっきりしている場合は、CSSColor.colorNamed() で色を取得する事ができます。見つからない場合は nil が戻ります。

メソッド名から取得

let color1 = CSSColor.mintcream
let color2 = CSSColor.orchid

CSS 3 で規定されている名前付きの色はクラスメソッドで用意されているので、CSSColor. の後数文字をタイプすればコード補完が効くので、便利だと思います。

色の全名称

全色の名前は以下の通りです。CSSColor.colorNamed() からでも利用できますし、CSSColor.aqua のように名前で直接参照しても構いません。

Name Value
aliceblue #F0F8FF
antiquewhite #FAEBD7
aqua #00FFFF
aquamarine #7FFFD4
azure #F0FFFF
beige #F5F5DC
bisque #FFE4C4
black #000000
blanchedalmond #FFEBCD
blue #0000FF
blueviolet #8A2BE2
brown #A52A2A
burlywood #DEB887
cadetblue #5F9EA0
chartreuse #7FFF00
chocolate #D2691E
coral #FF7F50
cornflowerblue #6495ED
cornsilk #FFF8DC
crimson #DC143C
cyan #00FFFF
darkblue #00008B
darkcyan #008B8B
darkgoldenrod #B8860B
darkgray #A9A9A9
darkgreen #006400
darkgrey #A9A9A9
darkkhaki #BDB76B
darkmagenta #8B008B
darkolivegreen #556B2F
darkorange #FF8C00
darkorchid #9932CC
darkred #8B0000
darksalmon #E9967A
darkseagreen #8FBC8F
darkslateblue #483D8B
darkslategray #2F4F4F
darkslategrey #2F4F4F
darkturquoise #00CED1
darkviolet #9400D3
deeppink #FF1493
deepskyblue #00BFFF
dimgray #696969
dimgrey #696969
dodgerblue #1E90FF
firebrick #B22222
floralwhite #FFFAF0
forestgreen #228B22
fuchsia #FF00FF
gainsboro #DCDCDC
ghostwhite #F8F8FF
gold #FFD700
goldenrod #DAA520
gray #808080
green #008000
greenyellow #ADFF2F
grey #808080
honeydew #F0FFF0
hotpink #FF69B4
indianred #CD5C5C
indigo #4B0082
ivory #FFFFF0
khaki #F0E68C
lavender #E6E6FA
lavenderblush #FFF0F5
lawngreen #7CFC00
lemonchiffon #FFFACD
lightblue #ADD8E6
lightcoral #F08080
lightcyan #E0FFFF
lightgoldenrodyellow #FAFAD2
lightgray #D3D3D3
lightgreen #90EE90
lightgrey #D3D3D3
lightpink #FFB6C1
lightsalmon #FFA07A
lightseagreen #20B2AA
lightskyblue #87CEFA
lightslategray #778899
lightslategrey #778899
lightsteelblue #B0C4DE
lightyellow #FFFFE0
lime #00FF00
limegreen #32CD32
linen #FAF0E6
magenta #FF00FF
maroon #800000
mediumaquamarine #66CDAA
mediumblue #0000CD
mediumorchid #BA55D3
mediumpurple #9370DB
mediumseagreen #3CB371
mediumslateblue #7B68EE
mediumspringgreen #00FA9A
mediumturquoise #48D1CC
mediumvioletred #C71585
midnightblue #191970
mintcream #F5FFFA
mistyrose #FFE4E1
moccasin #FFE4B5
navajowhite #FFDEAD
navy #000080
oldlace #FDF5E6
olive #808000
olivedrab #6B8E23
orange #FFA500
orangered #FF4500
orchid #DA70D6
palegoldenrod #EEE8AA
palegreen #98FB98
paleturquoise #AFEEEE
palevioletred #DB7093
papayawhip #FFEFD5
peachpuff #FFDAB9
peru #CD853F
pink #FFC0CB
plum #DDA0DD
powderblue #B0E0E6
purple #800080
red #FF0000
rosybrown #BC8F8F
royalblue #4169E1
saddlebrown #8B4513
salmon #FA8072
sandybrown #F4A460
seagreen #2E8B57
seashell #FFF5EE
sienna #A0522D
silver #C0C0C0
skyblue #87CEEB
slateblue #6A5ACD
slategray #708090
slategrey #708090
snow #FFFAFA
springgreen #00FF7F
steelblue #4682B4
tan #D2B48C
teal #008080
thistle #D8BFD8
tomato #FF6347
turquoise #40E0D0
violet #EE82EE
wheat #F5DEB3
white #FFFFFF
whitesmoke #F5F5F5
yellow #FFFF00
yellowgreen #9ACD32

UIColor, NSColor extension

CSSColor を実装するにあたり、UIColor または NSColor にエクステンションを実装しました。その使い方は以下のような要領です。

let color1 = UIColor(hexadecimalString: "#ff0000") // "#rrggbb"
let color2 = UIColor(hexadecimalString: "#ff000080") // "#rrggbbaa"
let color3 = UIColor(hexadecimalString: "#f731") // "#ff773311" と同等
let color4 = UIColor(hexadecimalString: "#248") // "#224488" と同等
let color5 = UIColor(hexadecimalString: "#aAbBcC") // 大文字小文字 OK

もちろん規定のフォーマット以外の場合は UIColor または NSColor を取得する事が出来ず、nil を返します。

let color6 = UIColor(hexadecimalString: "8A2BE2") // error: missing '#'
let color7 = UIColor(hexadecimalString: "#8A 2B E2") // error: no space please
let color8 = UIColor(hexadecimalString: "Hello World") // error: no kidding

もちろん OS X では NSColor で同等に使えます。

let color1 = NSColor(hexadecimalString: "#a52a2a") // NSColor

おまけ:UIColor と NSColor をどうやって抽象化しているのか?

CSSColor では、同じメソッドを呼び出しても、iOSでは UIColor を OS X では NSColor を戻していますが、CSSColor の実装自体は2度書きされているわけではなく、二つのクラスをうまく抽象化しています。実際には、CSSColor.swift の冒頭では以下のように定義しています。

#if os (OSX)
import Cocoa
typealias XColor = NSColor
#elseif os(iOS)
import UIKit 
typealias XColor = UIColor
#endif

これで実装の際には XColor を使えば、iOS で UIColor、 OS X では NSColor として実装されるので、二つのプラットフォームの抽象化には便利です。UIImageNSImageUIBezierPathNSBezierPath などにも応用できると思います。もちろん一方のプラットフォームにしか用意されていなメソッドなどは extension などで同等な処理を用意してあげるか、割り切って一方だけ用意するかなどの考慮が必要になります。

おまけ2

実際のメソッド名などを手作業で一つ一つ書いていくには誤操作が混入する可能性もあるし、そもそも面倒なので、colors.txt というタブ区切りファイルを用意してあります。

colors.txt
aliceblue   #F0F8FF
antiquewhite    #FAEBD7
aqua    #00FFFF
...

そして、Playground などで以下のコードを部分的に有効にしたり無効にしたりして、部分的なソースコードやマークダウンのコードを生成させています。ただ、colors.txt 自体は手動で整形しているので、やはりエラーが混入する恐れがあります。

extension String {

    func lines() -> [String] {
        var lines = [String]()
        self.enumerateLines { (line, stop) -> () in
            lines.append(line)
        }
        return lines
    }

}

let file = NSBundle.mainBundle().pathForResource("colors", ofType: "txt")!
let text = try! String(contentsOfFile: file)
for line in text.lines() {
    let columns = line.componentsSeparatedByString("\t")
    let name = columns[0]
    let value = columns[1]
    //print("\t\t\"\(name)\": \"\(value)\",")
    //print("\tclass var \(name): XColor { return CSSColor.colorNamed(\"\(name)\")! }")
    //print("|\(name) |\(value) |")
}

サンプルプロジェクト

iOS と OS X 用の Xcode のプロジェクトを用意しました。

Screen Shot (iOS)

Screen Shot (OS X)

Github

ソースコードは github より入手可能となっています。

フィードバック

誤入力や改善点などを見つけた場合は Kaz Yoshikawa までご連絡くださいませ。

License

MIT ライセンスとなっています。

9
9
0

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