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。ぱっと見ただけでどういう条件かも分かりやすくて便利かと。