3

I've read many articles on SO and I'm still stumped! I have an array of dictionaries, see below:

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"
    ])

This data will go into a tableView and I want the user to be able to decide the sort order, either by caseNumber or my caseLUD (date). But I can't figure out how to re-order the array by values. Any ideas, please? All help appreciated.

vacawama
  • 150,663
  • 30
  • 266
  • 294
FlatDog
  • 2,685
  • 2
  • 16
  • 19
  • You have put the dictionaries into an array, you just need to sort the array. Swift array has a `sort` method. Have you tried it? – Paulw11 Mar 27 '16 at 11:16
  • 1
    http://stackoverflow.com/questions/27639993/swift-sort-dictionary-by-value – Shades Mar 27 '16 at 11:22
  • In Obj-C I had done: NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"caseLUD" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName]; but I can't figure it out in Swift – FlatDog Mar 27 '16 at 11:24

1 Answers1

3

To sort by caseNumber:

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

Note, this uses caseNumber as a String which could lead to surprising results (for example "12345" < "2"). You might either want to store caseNumber as an Int, or convert it to an Int when sorting:

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

To sort by caseLUD:

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

.OrderedAscending will give you earliest date first, and .OrderedDescending will give you latest date first.


If you stored your data in a Struct instead of a Dictionary, you could avoid the messy typecasting.

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 }
vacawama
  • 150,663
  • 30
  • 266
  • 294