Menu
Coddy logo textTech

メソッドを持つ列挙型

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 15/57。

enumは、固定されたケースの集合を持つ型を定義します。値はドット記法で記述し、switchはすべてのケースを処理する必要があります。そのため、後からケースを追加すると、更新が必要なすべての箇所が示されます。

enum Direction {
    case north, east, south, west
}

let heading = Direction.east
switch heading {
case .north: print("up")
case .east: print("right")
case .south: print("down")
case .west: print("left")
}

出力:

right

列挙型にはメソッドや計算プロパティを持たせることができます。その内部では、self は現在のケースを表します:

enum Direction {
    case north, east, south, west

    var turnedRight: Direction {
        switch self {
        case .north: return .east
        case .east: return .south
        case .south: return .west
        case .west: return .north
        }
    }
}

print(Direction.north.turnedRight)
print(Direction.west.turnedRight.turnedRight)

出力:

east
east

raw value は各ケースに1つの型の固定値を割り当てます。init(rawValue:) は逆方向の処理を行い、一致するケースがない場合は nil を返します。

enum Size: String {
    case small = "S", medium = "M", large = "L"
}

print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)

出力:

M
true
true

関連値を使うと各ケースに独自のデータを持たせることができ、1つの型で形の異なる値を保持できます。switchはletを使ってデータをバインドします。

enum Payment {
    case cash(amount: Int)
    case card(number: String, amount: Int)

    var amount: Int {
        switch self {
        case .cash(let amount): return amount
        case .card(_, let amount): return amount
        }
    }
}

let payments: [Payment] = [.cash(amount: 20), .card(number: "4242", amount: 55)]
print(payments.map { $0.amount })

出力:

[20, 55]
challenge icon

チャレンジ

簡単

Command 列挙型を、forward、back、left、right のケースで完成させ、それぞれに raw 値 F、B、L、R を割り当ててください。位置の変化を返す計算プロパティ step を追加します。forward は 1、back は -1、left と right は 0 です。次に、各文字を init(rawValue:) でコマンドに変換し(未知の文字はスキップします)、position 2, turns 1, skipped 1 を返す run(_:) を完成させてください。

提供されたコードはコマンド文字の 1 行を読み取り、run(_:) の結果を出力します。

コードは Command.swift と Functions.swift に記述してください。main.swift には提供された入力/出力コードが含まれており、編集できません。

自分で試してみよう

// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Swiftプレイグラウンド