kitoko552.memo

kitoko552のメモ

Swiftでnil < 数値はtrueになる

Swiftではnilと数値を比較する際、nil < 数値はtrueになります。

let num: Int? = nil

if num < 300 {
    print("true") // numがnilでも通る。
}

この問題は特にOptional bindingする際に気をつけるべきです。
Optional bindingをすると、あるoptional型の変数がnilの場合はそこで評価が止まるので、わざわざif let文を書くのが面倒なときは

if hoge?.fuga?.count == num {

のように書くことができます。
しかし、比較対象の型が数値で、比較演算子<の場合も同じような意識で書くと危険です。

struct Model {
    var code: Int
    
    init?() {
        code = 100
        return nil
    }
}

let model = Model() // nil

if model?.code < 10 {
    print("true") // modelがnilなので通る。
}

nil < 数値どのような状況でもtrueになるので、if let文でoptional型の変数がnilでないことを確認したあとに比較を行うのが良いでしょう。

if let model = model where model.code < 10 {
    print("true") // 通らない。
}

詳解 Swift

詳解 Swift