[Swift] Optional のあまり知られていない使い方

WWDC ビデオを見返していて、.some や .none の使い方について理解していないことに気づいたのでまとめてみました。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Monterey 12.1 beta3
  • Xcode 13.2 beta2
  • iOS 15

Optional

Swift の Optional 自体は説明しませんが、Optional が enum であることは知っておく必要があります。

持つ値は、.some か .none です。この値を明示的に使用している人は少ない気もしますが、改めて説明します。

Optional.none

Apple のドキュメントは、こちら

Optional が値を持たないということを明確に表現するための 値(enum)。

nil をセットすることと動作的には同じになるはずですが、意図がより明確化されるので、.none を使用することが推奨されます。

Optional.some

Apple のドキュメントは、こちら

Optional の wrap する型( Int? という型であれば、Int のことです)になることを確認して値をセットする値(enum)。

ちょっと意味不明に感じるかもしれませんが、Optional 型を渡すケースで、値が存在することを明示的にしてセットしたい時に使うと良いと思います。

例えば、SwiftUI で選択できるリストであれば、selection には、Optional 型の Binding を渡します。選択対象とするリスト要素には、そので .tag 指定することが必要となります。

しかし、.tag は、Hashable な値はすべて受け取りますので、適切な型で渡しているかは、分かりにくいです。

このようなケースでは、(当たり前かもしれませんが)その値の型を明示してセットすることができるとコードの意図が分かりやすくなります。

つまり .tag に nil ではない = Optional の unwrap する型の値であることを確認して設定したいときに、.some を使うと明示できることになります。

まとめ:Optional の .some と .none

Optional の .some と .none
  • Optional 変数に 値をセットしないことを明示するためには、.none を使用する
  • Optional 変数に、特定の型であることを確認しながら渡すためには、.some を使用する
  • .some, .none を使用すると Optional での意図を明示しながら設定できるようになる

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です