35
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swiftで気軽に.noneを作ってはいけない

Last updated at Posted at 2019-02-20

既にある 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 という命名はしない方が良いなという教訓になりました。

35
18
2

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
35
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?