独自で定義した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 |