[iOS][Swift] Swiftっぽくレコードをソートをする

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

コメントを残す

メールアドレスが公開されることはありません。