NokkunBlog

Keep technology simple.

【Swift】オブジェクトを日付順にソートする方法

例えば、映画のタイトルや概要、上映日を管理するクラスがあったとして、そのクラスを上映日順にソートしたい場合はどうすれば良いのだろうか。

このサイトを参考にしながらコードを書いてみた。

まずは、映画を管理するクラスを作る。

import Foundation

class item: NSObject {
 
    var title: String = ""
    var desc: String = ""
    var date: Date = Date()
 
    func toDate(dateString:String) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MMMM d, yyyy, HH:mm:ss, z"
        if let date = dateFormatter.date(from: dateString) {
            self.date = date
        }
    }
}

タイトルと概要は文字列型だが、日付は文字列型で取り込んでDate型に変換することにする。

文字列型のままだとソートができないと思う。

次にitem型に適当なデータを詰め込んでいく。

var obj1 = item()
obj1.title = "Good Morning"
obj1.desc = "Love"
obj1.toDate(dateString: "March 6, 2017, 09:32:23, +0000")

var obj2 = item()
obj2.title = "Good Evening"
obj2.desc = "Like"
obj2.toDate(dateString: "June 3, 2017, 02:34:21, +0000")

var obj3 = item()
obj3.title = "Bad Morning"
obj3.desc = "No Good"
obj3.toDate(dateString: "February 3, 2017, 15:34:23, +0000")

最後の「+0000」はタイムゾーンのこと。

これがないと詰め込んだデータが勝手に修正されてしまうので指定した方が良い。

これで準備は完了。

肝心のソート部分は3行程度で実行できる。

var items = [obj1, obj2, obj3]

items = items.sorted(by: {
    $0.date.compare($1.date) == .orderedDescending
})

for obj in items {
    print("Sorted Date: \(obj.date) with title: \(obj.title)")
}

実行結果は以下の通り。

Sorted Date: 2017-06-03 02:34:21 +0000 with title: Good Evening
Sorted Date: 2017-03-06 09:32:23 +0000 with title: Good Morning
Sorted Date: 2017-02-03 15:34:23 +0000 with title: Bad Morning

映画のタイトルが最新の順番にソートされていることが確認できる。