在Swift 2中对一组字典进行排序

时间:2016-03-27 11:00:09

标签: ios arrays swift sorting dictionary

我已经阅读了很多关于SO的文章,我仍然难过!我有一系列词典,见下文:

var myArray = [[String:AnyObject]]()

myArray.append([
    "caseNumber" : "12349",
    "formType" : "Advanced",
    "caseStatus" : "Approved",
    "caseDetails" : "blah blah",
    "caseLUD" : NSDate(),
    "friendlyName" : "name1"
    ])

myArray.append([
    "caseNumber" : "12345",
    "formType" : "Standard",
    "caseStatus" : "On-Hold",
    "caseDetails" : "blah blah",
    "caseLUD" : NSDate(),
    "friendlyName" : "name2"
    ])

myArray.append([
    "caseNumber" : "12342",
    "formType" : "Normal",
    "caseStatus" : "Rejected",
    "caseDetails" : "blah blah",
    "caseLUD" : NSDate(),
    "friendlyName" : "name3"
    ])

此数据将进入tableView,我希望用户能够通过caseNumbercaseLUD(日期)来确定排序顺序。但我无法弄清楚如何按值重新排序数组。请问有什么想法吗?所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

caseNumber排序:

myArray.sortInPlace { ($0["caseNumber"] as! String) < ($1["caseNumber"] as! String) }

注意,这会将caseNumber用作String,这可能会导致令人惊讶的结果(例如"12345" < "2")。您可能希望将caseNumber存储为Int,或者在排序时将其转换为Int

myArray.sortInPlace { Int($0["caseNumber"] as! String) < Int($1["caseNumber"] as! String) }

caseLUD排序:

myArray.sortInPlace { ($0["caseLUD"] as! NSDate).compare($1["caseLUD"] as! NSDate) == .OrderedAscending}

.OrderedAscending会先给您最早的日期,.OrderedDescending会先给您最新的日期。

如果您将数据存储在Struct而不是Dictionary中,则可以避免混乱的类型转换。

struct CaseRecord {
    var caseNumber: Int
    var formType: String
    var caseStatus: String
    var caseDetails: String
    var caseLUD: NSDate
    var friendlyName: String
}

var myArray = [CaseRecord]()

myArray.append(CaseRecord(
    caseNumber : 12345,
    formType : "Advanced",
    caseStatus : "Approved",
    caseDetails : "blah blah",
    caseLUD : NSDate(),
    friendlyName : "name1"
    )
)

myArray.append(CaseRecord(
    caseNumber : 124,
    formType : "Standard",
    caseStatus : "On-Hold",
    caseDetails : "blah blah",
    caseLUD : NSDate(),
    friendlyName : "name2"
    )
)

myArray.append(CaseRecord(
    caseNumber : 13,
    formType : "Normal",
    caseStatus : "Rejected",
    caseDetails : "blah blah",
    caseLUD : NSDate(),
    friendlyName : "name3"
    )
)

myArray.sortInPlace { $0.caseNumber < $1.caseNumber }

myArray.sortInPlace { $0.caseLUD.compare($1.caseLUD) == .OrderedDescending }