例えば、映画のタイトルや概要、上映日を管理するクラスがあったとして、そのクラスを上映日順にソートしたい場合はどうすれば良いのだろうか。
このサイトを参考にしながらコードを書いてみた。
まずは、映画を管理するクラスを作る。
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
映画のタイトルが最新の順番にソートされていることが確認できる。