【问题标题】:Sorting an array of dictionaries in Swift 2在 Swift 2 中对字典数组进行排序
【发布时间】:2016-07-14 18:46:16
【问题描述】:

我已经阅读了很多关于 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,我希望用户能够通过caseNumber 或我的caseLUD(日期)来决定排序顺序。但我不知道如何按值重新排序数组。请问有什么想法吗?感谢所有帮助。

【问题讨论】:

  • 您已将字典放入数组中,您只需对数组进行排序即可。 Swift 数组有一个sort 方法。你试过了吗?
  • 在 Obj-C 中我做了: NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"caseLUD" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];但我无法在 Swift 中弄清楚

标签: ios arrays swift sorting dictionary


【解决方案1】:

caseNumber排序:

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

注意,这会将caseNumber 用作String,这可能会导致令人惊讶的结果(例如"12345" &lt; "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 }

【讨论】:

  • 再次感谢,非常有帮助。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2015-07-15
  • 2018-11-24
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多