くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

Swiftのenumについて

今回はSwiftでのenumについて書こうと思います

Javaenumとは違って、個人的に少しクセがあるのでまとめようと思います

一般的な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
}

そして、値型enumrawValueを使うと要素に割り当てられた値を取得することができます

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はできることが多く、使う機会があると思うので、調べていきたいです

参照

Swiftのenumについてまとめてみる