背景
swiftの勉強を始めてみて、enum(列挙型)の仕様や使い方がよくわからなかったので、公式ドキュメントを読みながらまとめてみました。
Appleの公式ドキュメントを参考にしました。
enumの概要
swiftのEnumerationsの説明の一行目には以下とあります。
An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code.
つまり、列挙型は関連する値の集合を共通するタイプとして定義し、それらの値を型安全に使用することができます、ということでしょうか。
仕様・使い方
基本の使い方
単純な形としては以下のように使うことができます。
・enum名の最初の文字は大文字で書く
enum CompassPoint {
case north
case south
case east
case west
}
var cPoint = CompassPoint.north
print(cPoint) //north
1行で複数のケースを定義することもできます。
enum Week {
case monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
var today = Week.monday
print(today) //monday
//enum型が代入された変数に対しては、別のケースを代入する場合はenum名を省くことができます。
today = .saturday
print(today) //saturday
enum型が入った変数には、そのenum型内で定義されているケースのどれかが入っているため、switch文と一緒に使うことで、Aの場合A+をする、Bの場合B+をするという処理が記述しやすくなります。
enum Week {
case monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
var today = Week.monday
switch today {
case .monday :
//here
print("Today is monday")
case .tuesday :
print("Today is tuesday")
default:
print("The day of today is unknown")
}
関連型enum(Associated Values)
Appleの公式ドキュメントでは「Associated Values」と書かれていましたが日本語にするとどうなるのでしょうか。今回は関連型enumと訳しました。
関連型enumでは、定義したケースに関連する値を付けることができます。
株の取引における以下のようなケースを考えてみましょう。
enum Trade {
case Buy
case Sell
}
func trade(tradeType: Trade, stock: String, amount: Int) {}
このような記述は間違いではありませんが、trade関数にenumのtradeTypeと一緒に渡すstockとamountは、caseがBuyにしろSellにしろ必ずついてくるもので、それを別々の引数として渡すことは不必要です。こういった場合、関連型enumを使うとスッキリと記述することができます。
enum Trade {
case Buy(stock: String, amount: Int)
case Sell(stock: String, amount: Int)
}
func trade(type: Trade) {}
var action = Trade.Buy(stock: "Apple", amount: 100)
enumに定義されるケースがクラスにおけるプロパティーを持つことができる、というようなイメージでしょか。
値型enum(Raw Values)
値型enumの仕様は以下になる。
・デファルト値(raw value)の代入ができる
・全ての値は同じ型でなければならない
・型は文字列型、キャラ型、整数、浮動小数点型でなければならない
・全ての値はユニークでなければならない
enum Week : Int {
case monday = 1
case tuesday = 2
case wednesday = 3
//以下は型が違うのでコンパイルエラー
//case thursday = "4"
//以下はユニークにならないのでコンパイルエラー
//case thursday = 3
}
//raw valueは以下のように.rawValueで取得できる。
var tomorrow = Week.monday.rawValue