連想値(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文のブロック内で各変数にセットすることができます。