SwiftのEnumは強力です。
普通に宣言した場合
enum CameraMakers {
case Canon , Nikon , Olympus , Panasonic , Sigma , Sony , Hasselblad , PhaseOne
}
// 使い方
// 素直に値を参照できる
var maker = CameraMakers.Nikon
// コンパイラが型を分かっていたらenum型を省略することも可能
maker = .Canon
Int値としての列挙型
割り当てられた値は”Raw Value”って呼ばれます
enum Weeks:Int {
case Sunday = 1,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
// enumの中にも関数を書けるよ!
func japaneseCaption() -> String {
switch self {
case .Sunday:return "日"
case .Monday:return "月"
case .Tuesday:return "火"
case .Wednesday:return "水"
case .Thursday:return "木"
case .Friday:return "金"
case .Saturday:return "土"
}
}
}
// RawValueの参照
NSLog("Tuesday : \(Weeks.Tuesday.rawValue)")
// ・・・ Tuesday : 3 って出力される
// Raw Valueからenumを求める事もできる
let wed:Weeks? = Weeks(rawValue:4);
enumの中に関数を書けるなんてビックリだよね。
Stringでも宣言可能
enum IOSDevices:String {
case iPhone = "アイフォーン"
case iPad = "アイパッド"
case iPodTouch = "アイポッドタッチ"
}
// 型がStringなenumでもちゃんと動く
let iphone = IOSDevices(rawValue:"アイフォーン")
if let device = iphone {
if device == IOSDevices.iPhone {
NSLog("device is iphone")
} else {
NSLog("device is not iphone")
}
} else {
NSLog("device is None")
}
enumをswitchで判定する
let iphone = IOSDevices.fromRaw("アイフォーン")
if let device = iphone {
switch device {
case .iPhone:
NSLog("device is iphone")
case .iPad:
NSLog("device is iPad")
default:
NSLog("device is something else.")
}
}
SwiftのEnumのユニークで強力な機能は要素ごとに全く違う値(と呼んで良いのかもわからないけど)を持てる事です
// これは。。。なんと呼べば良いのか?
// discriminated unions とか tagged unions って言うものらしいけど。
enum Lens {
case FixedFocalLens(String,Int,Double)
case ZoomLens(String,Int,Int,Double)
}
//使い方
// FixedFocalLens
let ef50f18 = Lens.FixedFocalLens("EF",50,1.8)
let ef100f28L = Lens.FixedFocalLens("EF",100,2.8)
// ZoomLensの値
let ef70_200F4L = Lens.ZoomLens("EF",70,200,4.0)
// 求めた値をswitchで条件分けして出力してみる
let lenslist = [ef50f18,ef100f28L,ef70_200F4L]
for lens in lenslist {
switch lens {
case .FixedFocalLens(let name,let focallength,let aperture):
NSLog("単焦点 \(name) \(focallength)mm F\(aperture)")
// letやvarはパラメータ毎に書くと面倒なので下記のようにまとめて指定できる
case let .ZoomLens( name, minfocallength, maxfocallength, aperture):
NSLog("ズームレンズ \(name) \(minfocallength)-\(maxfocallength)mm F\(aperture)")
}
}
// こんな感じで出力される
// 単焦点 EF 50mm F1.8
// 単焦点 EF 100mm F2.8
// ズームレンズ EF 70-200mm F4.0
これはenumの範疇を超えてるね