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" {
}
コメントを残す