LoginSignup
7
2

More than 5 years have passed since last update.

enum の case name に none, some を使う前に

Last updated at Posted at 2018-08-06

独自で定義したenumにnonesomeを使うと条件判定文で Optional型と競合しちゃうので気をつけましょうという話。

起こってしまったこと

case noneのあるenumを定義をしてしまったため
独自enumのnoneを判別し、処理したかったのに、
Optionalのnoneと判別するようなコードになってしまいました。

enum Meal {
case none    // 記録なし
case logged  // 記録済み 
case skipped // 食べなかった
}

var meal: Meal? = Meal.none

if meal == .none {
// ここはOptionalの`none`の時に処理される
}

解決案

@t-ea さんからのコメントより、以下のように書くときちんとOptionalを判別できます。
これから書くコードではこの条件式を利用すると、明確になっていいですね。

if meal == .some(.none) {
// ...
}

しかしながら、既存のcase nameをリファクタリング機能を使って変更すると既存のコードの意味合いが変わってしまう場合があるので、
nonesomeが使いたくなった場合は、違う名前をつけることも検討して見ましょう。

some none
done yet
complete incomplete
logged noLog
full empty
filled blank
7
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2