[Swift] 列挙型(Enum)の使い方

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の範疇を超えてるね

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です