こんにちは。ENDoDoです。
仕事でコード書いたり、勉強を始めたものの、Qiitaのネタで新規性のあるものを常に書くのって難しいので、業務やプライベートで詰まったりしたこととかをまとめていくのもありかと思って書こうと思います。
第二弾
今回はenumの使い方について書きたいと思います。
といっても、自分でサンプルを作るのは大変なので、このたびとても参考になったエンジニアのヤマシタさんのサンプル内容を勝手ながら流用させていただきたいと思います。
https://www.sejuku.net/blog/35711/
列挙型(enum)について
enumってstructや配列とどう違うの??とか思ってましたが、使い方が色々ありすぎて非常にとっつきづらいと感じたので、使い勝手をさっとまとめてみました。
通常の定義
enum Fruits {
case apple
case orange
case melon
case banana
case pineapple
}
要素の取得は以下のようにします。
//列挙体の要素を取得
let basket = Fruits.apple
print(basket)
出力結果:apple
Fruits.apple は 列挙体名.列挙子 と呼びます。
型省略
//列挙体の要素を取得
var basket: Fruits
basket = .apple
print(basket)
出力結果:apple
こんな感じで型を指定すると、.hogeって感じで値が参照できます。
ifで比較
//列挙体の定義
enum Fruits {
case apple
case orange
case melon
case banana
case pineapple
}
let basket = Fruits.melon
//if文による比較
if ( basket == .apple ) {
print("This is an apple.")
} else if ( basket == .orange ) {
print("This is an orange.")
} else if ( basket == .melon ) {
print("This is an melon.")
} else if ( basket == .banana ) {
print("This is an banana.")
} else if ( basket == .pineapple ) {
print("This is an pineapple.")
} else {
print("It does not apply to any")
}
出力結果:This is an melon.
このとき、basketには「Fruits.melon」が入ってるんですが、これはイコール「.meron」なので、上記結果が出力されます。
ただ、print(basket) → melon になります。
※「.melon」ではないので注意。ちょっと混乱してきます
値を設定
enum Fruits: String {
case apple = "りんご"
case orange = "オレンジ"
case melon = "メロン"
case banana = "バナナ"
case pineapple = "パイナップル"
}
値も入ります。キモいですね。
let basket = Fruits.apple.rawValue
print(basket)
出力結果:りんご
取り出したかったらこうやります。
整理すると、こうですね。
- print(Fruits.apple) → apple
- print(Fruits.apple.rawValue) → りんご
入れ子
//列挙体の定義
enum Weekly {
enum Dinner {
case Pasta
case Curry
case Tenpura
}
}
let Dinner = Weekly.Dinner.Curry
print(Dinner)
出力結果:Curry
ただし、以下のようにはできません。
case Curry = "カレー"
こうしたい場合には、
enum Dinner: String {
とDinnerにStringを継承させてあげる必要があります。
すると、
print(Weekly.Dinner.Curry.rawValue) → カレー
と出力できるようになります。
イニシャライザ
//列挙体の定義
enum Fruits {
case apple
case orange
case melon
case banana
case pineapple
init(){
self = Fruits.apple
}
}
//インスタンスを生成
let cl = Fruits()
print(cl)
出力結果:apple
イニシャライザを指定して、インスタンスを生成することもできます。まじでキモいな。。
self.appleじゃなくて、Fruits.apple ??
自分自身.case(列挙体名.列挙子)をselfに代入する と書きます。。。
今の僕にはなんかしっくりきません。
引数を指定
//列挙体の定義
enum Fruits {
case apple(price: Int)
case orange(price: Int)
case melon(price: Int)
case banana(price: Int)
case pineapple(price: Int)
}
//引数を指定する
let basket1 = Fruits.apple(price: 100)
let basket2 = Fruits.orange(price: 80)
print(basket1)
print(basket2)
出力結果:
apple(100)
orange(80)
caseには引数も入ります。。もうヤダ
case apple(price: Int) = "りんご"
ということはできません。
おわりに
enumの基本的な使い方をざっと整理しましたが、あくまで基本的な話なので合わせ技などが出てくると色々混乱してくると思います。
その辺りはまた経験を積んだらまとめたいと思います。