ちょっと驚いたのですが,何気なく以下のコードを書いたら普通に動きます(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
や!
を書かないで済むので,コードが少しはスッキリしますね。