シンプルな列挙型
C言語の列挙型は整数型でしたが特定の意味を持った整定数の集合を作成して1つの型として扱うことができるため便利な存在っだった。Swiftではそれ自身のメソッドを定義できるなどかなり拡張されたものになっている。
定義
enum Direction{
case up
case down
case right
case left
}
upやdownのことをメンバと呼ぶ
このように書くこともできる
enum Direction{
case up, down
, right, left
}
メソッドの定義
Swiftでは列挙型にメソッドを含めることができる
enum Direction {
case up, down, right, left
func clockwise() -> Direction {//メソッドの定義
switch self {
case .up: return .right
case .right: return .down
case .down: return .left
case .left: return .up
}
}
}
let d = Direction.up
d.clockwise() == Direction.down // d.right == d.down =>false
d.clockwise().clockwise() == Direction.down //d.right.clockwise() => d.down
列挙型における型と値
-
全メンバが同じデータ型の何らかの値を持つようになっているのが「値型」
-
それぞれのメンバが異なる構造を持ってインスタンスごとに値を変えるのが「共用型」
まず値型の列挙型について
メンバに共通するデータ型をその列挙型の実体型(raw type)
各メンバ(case _)に割り当てられた値を実体値(raw value)と呼ぶ。
定義
enum Direction : Int {
case up = 0 , down, right, left //up = 0が無くても順番に実体値が代入される。
}
let a = Direction.right
let i = a.rawValue //i => 2
Direction型をInt型を実体型とするように定義した。
最初のupの実体値(raw value)を0としたのでメンバ down, right, leftはそれぞれ1,2,3の値を持つ様になる。
もし、以下のように実体値がStringでリテラルを指定しない場合、メンバ名の文字列が実体型の値になる。
整数、文字列以外の型が実体型の場合、各メンバに対して必ずリテラルを記述し、それぞれ異なる実体値を持つ必要がある。
enum Direction : String {
case up = "上" , down, right, left
}
let a = Direction.up
let b = Direction.down
let i = a.rawValue // i=> 上
let j = b.rawValue //j=> down
次に共用型(union type)について
共用型の列挙型は,実体型を指定しないシンプルなものと複数の異なるタプルの構造を併せ持つ事ができる型
定義
enum Type {
case メンバ名 (型宣言)
case メンバ名 (型宣言)
case メンバ名 (型宣言)
case up = 0 , down, right, left //値型の列挙も出来る
}
具体的な例
enum WebColor {
case name(String) //color name
case code(String) //color code
case white,red,blue // color favorite
}
どの形式も「色」を指定するという目的を持っているので1つのデータ型に表す
let background = WebColor.name("darkcyan")
let darkgreen: WebColor = .code("#006400")
let textColor = WebColor.white
}
値型の列挙型との大きな違いはタプル構造を持つことが出来ること
switch文と組み合わせが良い
if-case文
for-in分でcaseを使える