LoginSignup
1

More than 5 years have passed since last update.

[備忘録]Swift4列挙型について1

Last updated at Posted at 2018-06-28

シンプルな列挙型

C言語の列挙型は整数型でしたが特定の意味を持った整定数の集合を作成して1つの型として扱うことができるため便利な存在っだった。Swiftではそれ自身のメソッドを定義できるなどかなり拡張されたものになっている。

定義

simple.swift
enum Direction{
case up
case down
case right
case left
}

upやdownのことをメンバと呼ぶ
このように書くこともできる

simple.swift
enum Direction{
case up, down, right, left
}

メソッドの定義

Swiftでは列挙型にメソッドを含めることができる


method.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)と呼ぶ。

定義

raw1.swift
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でリテラルを指定しない場合、メンバ名の文字列が実体型の値になる。
整数、文字列以外の型が実体型の場合、各メンバに対して必ずリテラルを記述し、それぞれ異なる実体値を持つ必要がある。

raw2.swift
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)について

共用型の列挙型は,実体型を指定しないシンプルなものと複数の異なるタプルの構造を併せ持つ事ができる型

定義

union.swift
enum Type {
case メンバ名 (型宣言)
case メンバ名 (型宣言)
case メンバ名 (型宣言)
case up = 0 , down, right, left //値型の列挙も出来る
}

具体的な例

card.swift
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を使える

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1