NSBlogger

意識高いブログ

SwiftでNSDateを直感的に比較する

NSDateの比較

下記のようにしてNSDateの比較ができます。

d1.compare(d2) == .OrderedDescending

compareというメソッドを使い、その結果が.OrderedSame、.OrderedDescending、.OrderedAscendingのどれに一致しているかを見て判断。いまいち直感的でない比較でよく混乱します。

<, >, == で比較できるようにする

下記のように「<」「>」「==」を拡張すると、直感的に比較ができるようになります。

func == (d1:NSDate, d2:NSDate) -> Bool {
    return d1.compare(d2) == .OrderedSame
}

func > (d1:NSDate, d2:NSDate) -> Bool {
    return d1.compare(d2) == .OrderedDescending
}

func < (d1:NSDate, d2:NSDate) -> Bool {
    return d1.compare(d2) == .OrderedAscending
}

func <= (d1:NSDate, d2:NSDate) -> Bool {
    return d1 < d2 || d1 == d2
}

func >= (d1:NSDate, d2:NSDate) -> Bool {
    return d1 > d2 || d1 == d2
}

使い方はこんなかんじ。

let now = NSDate()
let tomorrow = NSDate(timeIntervalSinceNow: 60 * 60 * 24)
let yesterday = NSDate(timeIntervalSinceNow: -60 * 60 * 24)

if now < tomorrow {
    print(true)
}

if yesterday <= now {
    print(true)
}

普通の文字列比較のように、右辺と左辺にNSDateのオブジェクトを指定してやればOK。ぱっと見ただけでどういう条件かも分かりやすくて便利かと。