メソッドを持つ列挙型
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
eastraw 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]チャレンジ
簡単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]))
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド