ローバリューとは
列挙型の各ケースは、ケースと結びつけられた値を持つことができます。その値をローバリュー(raw value)と言います。
一つの列挙型の各ケースのローバリューは全て同じ型である必要があります。
enum 列挙型名 : ローバリューの型{ case ケース名1 = ローバリュー1 case ケース名2 = ローバリュー2 case ケース名3 = ローバリュー3 }
sample1-1
enum EvaluationOfPlayer:String{ case size="体格" case speed="スピード" case tech="得意技" } var point1=EvaluationOfPlayer.size print(point1) var point2:EvaluationOfPlayer?=EvaluationOfPlayer(rawValue:"体格") print(point2) var point3=EvaluationOfPlayer(rawValue:"スピード") print(point3) var point4=EvaluationOfPlayer(rawValue: "学力") print(point4)
//size //Optional(__lldb_expr_1.EvaluationOfPlayer.size) //Optional(__lldb_expr_1.EvaluationOfPlayer.speed) //nil
sample1-1では、ローバリューの型がString型である列挙型EvaluationOfPlayerを定義しています。
ローバリューを持つ列挙型を定義した場合、引数名がrawValueで、「列挙型のケース、あるいはnil」を返す失敗可能イニシャライザが自動的に生成されます。
ローバリューを持つ列挙型ではイニシャライザの引数に、引数名rawValueでローバリューを指定することで、そのローバリューに対応するケースを値とするインスタンスを生成できます。(9行目と12行目)
イニシャライザの引数として、ローバリューとして存在しない値を指定するとnilが返されます。(15行目)
一つの列挙型の中で各ケースと結びつく各ローバリューは全て異なる値でなければなりません。
ローバリューのデフォルト値
ローバリューは上記のように、列挙型の定義時に各ローバリューをセットするのが基本的な方法ですが、列挙型定義時にローバリューをセットしない方法もあります(←ローバリューの型がInt型・String型の場合のみ)。まずsample2-1でローバリューがint型の場合を見てみます。
sample2-1
enum EvaluationOfPlayer:Int{ case size case speed case tech case intelligence case dedication } print(EvaluationOfPlayer.size.rawValue) print(EvaluationOfPlayer.speed.rawValue) print(EvaluationOfPlayer.tech.rawValue) print(EvaluationOfPlayer.intelligence.rawValue) print(EvaluationOfPlayer.dedication.rawValue) //0 //1 //2 //3 //4
ローバリューを持つ列挙型の値はrawValueプロパティを自動的に生成されますので、上記sample2-1、7行目以降のようにしてローバリューにアクセスできます。
列挙型定義ではローバリューをセットしていないのですが、自動的にInt型のローバリューが0から割り振られているのがわかります。
どうでもいいですがdedicationは献身性です。
部分的にローバリューをセットすることもできます。あまり実用的ではないですが、挙動はsample2-2のようになります。
sample2-2
enum EvaluationOfPlayer:Int{ case size case speed=5 case tech case intelligence=100 case dedication } print(EvaluationOfPlayer.size.rawValue) print(EvaluationOfPlayer.speed.rawValue) print(EvaluationOfPlayer.tech.rawValue) print(EvaluationOfPlayer.intelligence.rawValue) print(EvaluationOfPlayer.dedication.rawValue) //0 //5 //6 //100 //101
ケースspeed,intelligenceのローバリューは自分でセットしている。
ローバリューの型としてString型を指定して、ローバリュー自体はセットしないと、自動的にケース名の文字列がローバリューのデフォルト値としてセットされます。(sample2-3)
sample2-3
enum EvaluationOfPlayer:String{ case size case speed case tech case intelligence case dedication } print(EvaluationOfPlayer.size.rawValue) print(EvaluationOfPlayer.speed.rawValue) print(EvaluationOfPlayer.tech.rawValue) print(EvaluationOfPlayer.intelligence.rawValue) print(EvaluationOfPlayer.dedication.rawValue) //size //speed //tech //intelligence //dedication