F.Ko-Jiの「一秒後は未来」

Swift: Optional型の変数は比較時に自動的にunwrapされる

String? のような Optional 型の変数を比較するときには nil かどうか調べたり、明示的に unwrap したりしないといけないのかなと思っていたのだが、実はそうではなかった。

比較演算子を使うと、optional 型の変数が自動的にアンラップ(unwrap)される。

» [Swift] Optional(オプショナル)型についてのまとめ Ver2 – Qiita

ドキュメントのどこに書かれてるか分からなかったが、実際に試してみるとそうなっている。例えば以下のように変数を unwrap せずに比較が可能。

var x: String?
x = "hello"

// x! でも x? でもなく x でよい
if x == "hello" {
  // これが出力される
  println("x is hello")
}

var y: String?
// y が nil でもエラーにならない
if y == nil {
  println("y is nil")
}

変数 x の値は Optional なので厳密には “hello” という文字列と同じではないのだが、このように比較時にはその値が取り出されて実行される。

注意しないといけないのは、これは String? のように ? の場合の話であって、String! のように書く「Implicitly Unwrapped Optional 型」の場合には当てはまらないということ。

var y: String!

// y は nil なのでエラー
if y == "hoge" {
}

なので Implicitly Unwrapped Optional 型の場合は明示的に nil でないことを確認しないといけない。

var y: String!

if y != nil && y == "hoge" {
}

コメントを残す

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

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など