kitoko552.memo

kitoko552のメモ

Swiftでenumを使う

Swiftenumは以下のように書けます。

enum Season {
    case Spring
    case Summer
    case Autumn
    case Winter
}
enum Season {
    case Spring, Summer, Autumn, Winter
}

メソッドも書けます。

enum Season {
    case Spring, Summer, Autumn, Winter
    
    func next() -> Season {
        switch self {
        case .Spring:
            return .Summer
        case .Summer:
            return .Autumn
        case .Autumn:
            return .Winter
        case .Winter:
            return .Spring
        }
    }
}

メソッドだけでなく、プロパティも定義できますが、計算型プロパティとタイププロパティのみ定義可能です。

enum Season {
    case Spring, Summer, Autumn, Winter
    
    // タイププロパティ
    static let defaultSeason = Spring
    
    // 計算型プロパティ(getのみ)
    var nice: Bool {
        switch self {
        case .Spring, .Autumn:
            return true
        default:
            return false
        }
    }
}

自分自身の値を変えるメソッドには、先頭にmutatingを付けます。

enum Season {
    case Spring, Summer, Autumn, Winter
    
    mutating func next() {
        switch self {
        case .Spring:
            self = .Summer
        case .Summer:
            self = .Autumn
        case .Autumn:
            self = .Winter
        case .Winter:
            self = .Spring
        }
    }
}

イニシャライザを定義する際は、selfに何を代入するかを定義することになります。

enum Season {
    case Spring, Summer, Autumn, Winter
    
    init() {
        self = Spring
    }
}

タイプメソッドも定義できます。定義の際には構造体と同様に先頭にstaticを付けます。

enum Season {
    case Spring, Summer, Autumn, Winter
    
    static func toJapanese(s:Season) -> String {
        switch s {
        case .Spring:
            return "春"
        case .Summer:
            return "夏"
        case .Autumn:
            return "秋"
        case .Winter:
            return "冬"
        }
    }
}

値型(value type)

実体型を定義することができます(値型のenum)。

enum Season: String {
    case Spring = "春", Summer = "夏", Autumn = "秋", Winter = "冬"
}

実体型を定義すると、自動的にプロパティrawValueが定義され、その列挙型の実体値を取り出すことが可能になります。

let season = Season.Spring
println(season.rawValue) // 春

同様に、イニシャライザinit?(rawValue:)も定義され、実体型の値から列挙型のインスタンスを生成できるようになります。

let season = Season(rawValue: "春")

if let s = season {
    println(s.rawValue) // 春
}

実体型をInt型で定義すると、ひとつ前の値にプラス1されたものが値となります。

enum Season: Int {
    // Spring=1, Summer=2, Autumn=3, Winter=4となる
    case Spring = 1, Summer, Autumn, Winter
}

先頭の値が指定されていない場合は0になります。

enum Season: Int {
    // Spring=0, Summer=1, Autumn=2, Winter=3となる
    case Spring, Summer, Autumn, Winter
}
enum Season: Int {
    // Spring=0, Summer=1, Autumn=10, Winter=11となる
    case Spring, Summer, Autumn = 10, Winter
}

共用型(union type)

複数の異なるタプルの構造を持つことができます(共用型のenum)。

enum Season {
    case Spring(Int)
    case Summer(String, Int)
    case Autumn // 何も定義しなくてもOK
    case Winter(snowy: Bool)
}

共用型の場合は、処理をswitch文で分ける必要があります。

// sはSeasonのインスタンス
switch s {
case .Spring(let hoge):
    println(hoge)
case let .Summer(fuga, _):
    println(fuga)
case .Autumn:
    println("秋")
case .Winter(let snowy):
    println(snowy)
}

上の例で使われているletについては、Swiftのタプルの基本を参照してください。

※この記事では以下の本を参考にしています。

詳解 Swift

詳解 Swift