Swift 列挙型 パート3(raw value)

ローバリューとは

列挙型の各ケースは、ケースと結びつけられた値を持つことができます。その値をローバリュー(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

 

 

 

 

コメントを残す

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