LoginSignup
4
4

More than 5 years have passed since last update.

Swiftの比較演算子を使うとき,変数は自動でアンラップされる。

Posted at

ちょっと驚いたのですが,何気なく以下のコードを書いたら普通に動きます(Xcode 6.1 Beta)。

var a: Int? = 1
a == 1    // true
a < 2     // true

a = nil
a == 1    // false
a < 2     // true

Optionalを陽にアンラップする必要はないようです。コンパイラが左辺をアンラップ,または右辺をオプショナル化のどちらかを自動でやってくれるようです。
(nilとの比較では,nilはどんな値よりも小さい値として扱われるようです。参考)

定義したタイプでも可能なのか確かめてみます。

struct A: Equatable, Comparable {
    var v: Int
}

func ==(lhs: A, rhs: A) -> Bool {
    return lhs.v == rhs.v
}

func <(lhs: A, rhs: A) -> Bool {
    return lhs.v < rhs.v
}


let c: A  = A(v: 1)
var d: A? = A(v: 1)

c == d    // true
c < d     // false

d = nil
c == d    // false
c > d     // true

独自定義タイプも大丈夫なようですね。

そのほか組み込みのStringなどでもO.K.でしたが,配列に対してはエラーが出るので手前でアンラップする必要があります。

if let!を書かないで済むので,コードが少しはスッキリしますね。

4
4
0

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
4
4