Swift 列挙型 パート2(連想値)

連想値(associated value,)とは

列挙型の連想値とは、列挙型の一つ一つのケースにひも付けされた値のことです。ケースと結びつけられた値というとローバリュー(raw value)が思い浮かびます。ローバリューと連想値の違いとしては

●ある列挙型のローバリューは全て同じ型でなければならない。またローバリューとして指定できるのはInt型、Float型、String型、Character型など一部の型に限られる。

●ある列挙型の連想値は各ケース毎に異なる型でも問題ない。連想値はあらゆる型を指定できる。

上記のような違いがあります。


連想値を持つ列挙型の定義方法

sample1-1

enum EvaluationOfPlayer{
    case size(Int,Int)
    case speed(Int)
    case tech(String)
}

sample1-1ではEvaluationOfPlayerという名の列挙型を定義しています。

size,speed,techの3つのケースがあり、

ケースsizeは(Int,Int)型の連想値、

ケースspeedはInt型の連想値、

ケースtechはString型の連想値を持つように定義しています。


連想値を持つ列挙型のインスタンス生成方法

sample2-1

enum EvaluationOfPlayer{
    case size(Int,Int)
    case speed(Int)
    case tech(String)
}

var point1=EvaluationOfPlayer.size(190,80)
var point2=EvaluationOfPlayer.speed(10)
var point3=EvaluationOfPlayer.tech("エラシコ")

7,8,9行目で「連想値を持つ列挙型のインスタンス」を生成し、変数point1,point2,point3に代入しています。


sample2-2

enum EvaluationOfPlayer{
    case size(Int,Int)
    case speed(Int)
    case tech(String)
}

var point1=EvaluationOfPlayer.size(190,80)
var point1_1=EvaluationOfPlayer.size(180,70)
print("133,\(point1)")
print("134,\(point1_1)")

point1 = .size(174,65)
print("137,\(point1)")
133,size(190, 80)
134,size(180, 70)
137,size(174, 65)

7行目で変数point1にEvaluationOfPlayer型の値を代入しており、この時点でpoint1はEvaluationOfPlayer型であると型推定します。その後point1に別のEvaluationOfPlayer型の値を代入する場合、12行目のように「EvaluationOfPlayer」を省略して記述することができます。省略せずに

point1 = EvaluationOfPlayer.size(174,65)

と記述しても問題ありません。


sample2-3

enum EvaluationOfPlayer{
    case size(Int,Int)
    case speed(Int)
    case tech(String)
}

var point1=EvaluationOfPlayer.size(190,80)
var point1_1=EvaluationOfPlayer.size(180,70)
print("133,\(point1)")

point1 = .speed(9)
print(point1)
//133,size(190, 80)
//speed(9)

変数point1はEvaluationOfPlayer型と型推定されますので、その後、同じEvaluationOfPlayer型の値である

.speed(9)

を代入することもできます。つまり列挙型の値(インスタンス)を生成する毎に、毎回別の連想値を設定することができる、ということですね。ローバリューの場合ケースが特定されれば自動的にそのケースに対応するローバリューが決まりますので、ここがローバリューと異なる点です。


列挙型のケースを調べて、連想値を取得する

sample3-1

enum EvaluationOfPlayer{
    case size(Int,Int)
    case speed(Int)
    case tech(String)
}

var point1=EvaluationOfPlayer.size(190,80)
var point2=EvaluationOfPlayer.speed(10)
var point3=EvaluationOfPlayer.tech("エラシコ")

func printEval(_ point:EvaluationOfPlayer){
    switch point{
    case .size(let height,let weight):print("身長:\(height)cm--体重\(weight)kg")
    case .speed(let move):print("秒速\(move)m/s")
    case .tech(let tech):print("得意技:\(tech)")
    }
}

printEval(point1)
printEval(point2)
printEval(point3)

//身長:190cm--体重80kg
//秒速10m/s
//得意技:エラシコ

printEval関数は、EvaluationOfPlayerの値を受け取り、引数のケースにより、Switch文を用いて表示する連想値を変化させています。上記の記述方法でそれぞれの連想値を、Switch文のブロック内で各変数にセットすることができます。

 

 

 

コメントを残す

メールアドレスが公開されることはありません。