【Swift】列挙型の使い方

Swift

Swiftの列挙型は他の言語に比べて、より柔軟に使用することができます。今回はそんなSwiftにおける列挙型の使い方について説明していきます。

列挙型とは

列挙型(enum)とは、関連するいくつかの値を1つの型に定義してまとめたものです。

Swiftの列挙型は、他の言語にはないさまざまな特徴があります。

基本的な使い方

列挙型の定義

最もシンプルな定義の仕方は以下のようになります。

enum Animal {
    case dog
    case cat
    case rabbit
}

let myPet = Animal.dog
型の省略

あらかじめ方が宣言されている場合は、値を入れるときに型を省略できます。

enum Animal {
    case dog
    case cat
    case rabbit
}

var myPet: Animal
myPet = .dog // Animalを省略できる
値の設定(値型enum)

各ケースに値を持たせることもできます。ただし、使用できるのはInt型、Double型、String型、Character型で、それ以外を持たせようとするとエラーになります。また、持たせる値の型はその列挙型のなかで統一されていないといけません。

enum Animal: String {
    case dog = "いぬ"
    case cat = "ねこ"
    case rabbit = "うさぎ"
}

let animal = Animal.dog
print(animal)  // いぬ

応用的な使い方

Swiftの列挙型は上記以外にもより複雑な使い方ができます。

イニシャライザ

イニシャライザを使用することで、初期値を設定できます。

enum Animal {
    case dog
    case cat
    case rabbit

    init() {
        self = Animal.dog
    }
}

let animal = Animal()

print(animal)  // dog
列挙型のネスト

Swiftの列挙型は階層構造にもできます。

enum Animal {
    enum Dog {
        case poodle
        case chihuahua
    }
    enum Cat {
        case britishShorthair
        case persian
    }
    enum Rabbit {
        case hollandLop
        case netherlandDwarf
    }
}

let myPet = Animal.Dog.chihuahua
付属型enum

各ケースに付属する値を定義することができます。
各ケースごとに異なる型の値を設定することができます。

enum Barcode {
    case upca(Int, Int, Int, Int)
    case qrcode(String)
}

var productBarcode = Barcode.upca(9, 87654, 321098, 7)
productBarcode = .qrcode("ABCDEFGHIJKLMNOP")
メソッドの宣言

Swiftの列挙型はメソッドを定義することができます。

enum Animal {
    case dog
    case cat
    case rabbit
    
    func inJPName() -> String {
            switch self {
            case .dog:
                return "犬"
            case .cat:
                return "猫"
            case .rabbit:
                return "うさぎ"
            }
        }
}

let myPet = Animal.dog.inJPName()
print(myPet) // 犬
プロパティの宣言

また、プロパティの宣言も可能です。ただし、宣言できるのは算出型プロパティとタイププロパティで、格納型プロパティは宣言できません。

enum Device {
    case iPhone13mini
    case iPhone13
    case iPhone13Pro
    case iPhone13ProMax
    
    var inchSize: Double {
        switch self {
        case .iPhone13mini: return 5.4
        case .iPhone13: return 6.1
        case .iPhone13Pro: return 6.1
        case .iPhone13ProMax: return 6.7
        }
    }

    static let operatingSystem = "iOS"
}

終わりに

他にも列挙子を亡くしたり、プロトコルに準拠したり、Extensionで拡張したりということもできます。また後日説明するかも。

コメント

タイトルとURLをコピーしました