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と違い、任意のクロージャを定義できるので、
より柔軟なソートができるのがいいですね。