既にある enum
の値を比較したかったのですが、思った挙動にならなくて少しハマったので備忘録として書いておきます。
定義としては
enum Foo: Int, Codable {
case none // サーバーで0番で定義されているので必須
case bar
}
みたいな enum
です。 bar
以外にも沢山あるんですが一旦これで大丈夫です。
クラスのプロパティはこんな感じ
struct Baz: Codable {
var foo: Foo? // 値自体も `Optional`
}
サーバーからJSONとか何かしらのデータを受けとってインスタンス化してBarの値が .none
かそうじゃないかをハンドリングしたかったので
let data = ...
let baz = try! JSONDecoder().decode(Baz.self, from: data)
if baz.foo == nil || baz.foo == .none {
// データが無いよって言う
} else {
// データがあるよって言う
}
としたんですが baz.foo
の値が .none
なのに .none
と判定してくれませんでした。
ここでようやく Optional
の存在を思い出しました。
あ...
と言うわけで
-if baz.foo == nil || baz.foo == .none {
+if baz.foo == nil || baz.foo == Foo.none {
// データが無いよって言う
} else {
// データがあるよって言う
}
に変更したら思った挙動になりました。
まとめ
Optional
でラップされている値に .none
で比較してしまうと Optional.none
として比較されてしまい、思った挙動にならないので安易に .none
という命名はしない方が良いなという教訓になりました。