NSSortDescriptorはObjective-Cでも使えるレコードの配列をレコードキーでソートするのに便利な方法ですが、Arrayのsort()メソッドやsorted()メソッドを使うとよりSwiftっぽくクロージャでソートすることができます。
変更前:
let records = NSMutableArray() let sortDescriptor = NSSortDescriptor(key: "fileSize", ascending: true) records.sortedArrayUsingDescriptors([sortDescriptor]) // レコード投入 let record1 = NSMutableDictionary() record1["filePath"] = "/path/to/file1" record1["fileSize"] = 1000 records.addObject(record1) let record2 = NSMutableDictionary() record2["filePath"] = "/path/to/file2" record2["fileSize"] = 100 records.addObject(record2) let record3 = NSMutableDictionary() record3["filePath"] = "/path/to/file3" record3["fileSize"] = 500 records.addObject(record3) println(records)
変更後:
// [[String:Any]] でもいいが、レコード型を明示するためタプルにする。
// タプルでなくクラスに置き換えるのもよし。
var records:[(fileSize:Int,filePath:String)] = []
// レコード投入
let record1:(fileSize:Int,filePath:String) = (1000, "/path/to/file")
records.append(record1)
let record2:(fileSize:Int,filePath:String) = (100, "/path/to/file2")
records.append(record2)
let record3:(fileSize:Int,filePath:String) = (500, "/path/to/file3")
records.append(record3)
// 昇順ソート実行。sortなら自分自身をソート、sortedなら自分は変えずにソートした結果を返す
records.sort { (a, b) -> Bool in a.fileSize < b.fileSize }
println(recors)
肝はsortに渡すクロージャです。
records.sort { (a, b) -> Bool in a.fileSize < b.fileSize }
は省略した書き方で、省略せずに書くと以下のようになります。
records.sort({
(a:(fileSize:Int,filePath:String), b(fileSize:Int,filePath:String)) -> Bool in
return a.fileSize < b.fileSize
})
NSSortDescriptorと違い、任意のクロージャを定義できるので、
より柔軟なソートができるのがいいですね。