今回はSwiftでのenumについて書こうと思います
Javaのenumとは違って、個人的に少しクセがあるのでまとめようと思います
一般的なenum
enum DominantArm { case left case right } let leftHand = DominantArm.left
caseで要素を定義します。let leftHand: DominantArm = .left
のように書くこともできます
値型enum
各要素に指定した型の値を割り当てることができます
各要素に割り当て可能なのは整数値リテラル、浮動小数点数値リテラル、文字列リテラルのみで、その他の型を割り当てようとするとエラーになります
enum DominantArm: Int { case left = 1 case right = 2 }
そして、値型enumはrawValue
を使うと要素に割り当てられた値を取得することができます
let leftHand: DominantArm = .left signalBlue.rawValue //1
最初、rawValueってなんだと思ったらそういう仕様なんですね!!
また、値から列挙型を生成するイニシャライザが存在します
引数のrawValue
に指定した値に対応する要素がない場合はnilが返ってきます。これは便利ですね
let leftHand: DominantArm? = DominantArm(rawValue: 1) leftHand?.rawValue //1 //DominantArmには3に該当する要素が存在しないのでnilが返る let unknownHand: DominantArm? = Signal(rawValue: 3) unknownHand?.rawValue //nil
値型enumで要素に値を割り当てなかった場合、数値リテラルの場合は一番上の要素が0になり、下にいくつにれてインクリメントされた値になります
文字リテラルの場合は、要素と同じ名前の値になります。これも最初驚きました
関連型enum
関連型enumは要素に付属する値を定義することができます
関連型は要素そのものの値ではないので値型のようにサポートできる型の制限もありません
enum Language { case ja(String) case en(String) } var hello = Language.ja("こんにちは") hello = .en("Hello")
このように使い分けができるので、可読性が上がります
enumのネスト
enumをネストして階層構造を明確にすることができます
enum Earth { enum Human { case left case right } case animal } let character = Earth.animal // 左利きを取得 let weapon = Earth.Human.left
enumのメソッド
Swiftのenumはメソッドを定義することができます
enum Country { case japan case america func convertJapanese() -> String { switch self { case .japan: return "日本" case .america: return "アメリカ" } } }
また、mutating属性
をメソッドに定義することで列挙型自身を変更できます
下記は普段使うことのない一例ですww
enum Country: String { case japan = "日本" case america = "アメリカ" mutating func randomConvertJapanese() { switch self { case .japan: self = .america case .america: self = .japan } } } var country = Country.japan country.randomConvertJapanese() country.rawValue //"アメリカ"
ここまででまた一部です
プロパティとかまだまだありますので、別の機会に書きたいと思います
Swiftのenumはできることが多く、使う機会があると思うので、調べていきたいです