#author("2016-05-14T10:03:16+00:00","default:nitta","nitta")
[[Swift/pattern]]

*Swift/パターン/列挙型 [#ea2ae80b]

 enum Direction {  // 列挙型Direction
   case Up         // 列挙型のメンバ (member)
   case Down
   case Right
   case Left
 }

 enum Direction {
   case Up, Down, Right, Left
 }

列挙型のメンバは、たとえばDirection.Up のように「列挙型の名前」.「メンバ名」で表す。
 let d = Direction.Up
 var x : Direction = .Right
 d == x  // false。異なる値なので

列挙型の定義にメソッドを含めることができる。

 enum Direction {
   case Up, Down, Right, Left
   func clockwise() -> Direction {     // 時計回りに90度回転した方向
     switch self {
       case .Up: return Right   // 列挙型の内部ではメンバ名を直接参照できる
       case .Down: return Left
       case .Right: return Down
       case .Left: return Up
     }
   }
 }
 let d = Direction.Up
 d.clockwise() == Direction.Down   // false
 d.clockwise().clockwise() == Direction.Down   // true

一般的には "Direction.Up" と記述するが、型が推論できる場合には ".Up" と省略ができる。
さらに、列挙型の定義内部では "Up" のようにメンバ名だけて記述できる。

列挙型の内部には、格納型のプロパティは定義できないが、計算型のプロパティは定義できる。
タイププロパティは格納型、計算型どちらも定義でき、また、タイプメソッドも定義できる。

**2種類の列挙型 [#k5b25509]
列挙型には次の2種類がある。
-値型 : 全メンバが同じデータ型の値を持つ
-共用型 : それぞれメンバが異なる構造を持ち、インスタンス毎に値を変えることのできる

***値型の列挙型 [#q52205db]

全てのメンバが同じ型の値を持つように定義できる。
メンバの値はどれも異なっている必要がある。
 enum 型名 : 実体型 {  // 実体型になれるのは 整数、実数、Book値、文字列リテラルで初期化できる型のみ。
   case メンバ名 = リテラル   // "= リテラル"の部分はオプション
   case メンバ名 = リテラル
   ...
 }

 enum Direction : Int {
   case Up = 0, Down, Right, Left
 }
 let a = Direction.Right
 let i = a.rawValue    // i = 2 (Int)
 let k = Direction.Down.rawValue    // k = 1 (Int)

実体型 (raw type ) の値からそれに対応する列挙型のインスタンスを得るには、
rawValue: というキーワードの引数を1つ持つイニシャライザを使う。
失敗のあるイニシャライザなので nil が返ってくる可能性があり、オプショナル型となる。


 let b: Direction ? = Direction(rawValue:3)
 b != Direction.Left     // true
 if let c = Direction(rawValue:2) {
   print("\(c.rawValue)")    / 2と表示される
 }

 enum Direction : Int {
   case Up = 0, Right, Down, Left
   func clockwise() -> Direction {
     let t = (self.rawValue + 1) % 4     // selfはインスタンス自身を表す
     return Direction(rawValue:t)!       // nilになることはない
   }
 }

***共用型の列挙型 [#fde8db42]

共用型 (union type の列挙型は、実体型を指定しないシンプルな列挙型と、
複数の異なるタプルの構造を併せ持つことができる型である。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS