独自で定義したenumにnone
やsome
を使うと条件判定文で 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をリファクタリング機能を使って変更すると既存のコードの意味合いが変わってしまう場合があるので、
none
やsome
が使いたくなった場合は、違う名前をつけることも検討して見ましょう。
some | none |
---|---|
done | yet |
complete | incomplete |
logged | noLog |
full | empty |
filled | blank |