Try this:
results.sorted {($0.group_name, $0.first_name) < ($1.group_name, $1.first_name)}
Example:
struct Item {
var first_name: String
var group_name: String
}
let results = [
Item(first_name: "A", group_name: "cats"),
Item(first_name: "B", group_name: "dogs"),
Item(first_name: "C", group_name: "cats")
]
let sortedResult = results.sorted {($0.group_name, $0.first_name) < ($1.group_name, $1.first_name)}
print(sortedResult)
//->[SortGroups.Item(first_name: "A", group_name: "cats"), SortGroups.Item(first_name: "C", group_name: "cats"), SortGroups.Item(first_name: "B", group_name: "dogs")]
An example where Carpsen90's current code fails.
struct Animal {
let Name: String
let Group: String
}
let animals = [
Animal(Name: "B", Group: "rats"),
Animal(Name: "C", Group: "dogs"),
Animal(Name: "E", Group: "cats"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "A", Group: "cats"),
Animal(Name: "C", Group: "dogs"),
Animal(Name: "E", Group: "cats"),
Animal(Name: "A", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "D", Group: "cats"),
Animal(Name: "A", Group: "cats"),
Animal(Name: "B", Group: "cats"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "D", Group: "rats"),
Animal(Name: "A", Group: "rats"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "D", Group: "dogs"),
Animal(Name: "A", Group: "dogs"),
Animal(Name: "A", Group: "rats")
]
let result = animals.sorted(by: {$0.Group < $1.Group}).sorted(by: {$0.Group == $1.Group && $0.Name < $1.Name })
print("[\n "+result.map {String(describing: $0)}.joined(separator: ",\n ")+"\n]")
Output:
[
Animal(Name: "E", Group: "cats"),
Animal(Name: "A", Group: "dogs"),
Animal(Name: "A", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "C", Group: "dogs"),
Animal(Name: "C", Group: "dogs"),
Animal(Name: "A", Group: "cats"),
Animal(Name: "B", Group: "cats"),
Animal(Name: "D", Group: "cats"),
Animal(Name: "E", Group: "cats"),
Animal(Name: "D", Group: "dogs"),
Animal(Name: "A", Group: "cats"),
Animal(Name: "A", Group: "rats"),
Animal(Name: "A", Group: "rats"),
Animal(Name: "B", Group: "rats"),
Animal(Name: "D", Group: "rats")
]
Using tuple comparison for the same input:
let result2 = animals.sorted {($0.Group, $0.Name) < ($1.Group, $1.Name)}
print("[\n "+result2.map {String(describing: $0)}.joined(separator: ",\n ")+"\n]")
Output:
[
Animal(Name: "A", Group: "cats"),
Animal(Name: "A", Group: "cats"),
Animal(Name: "B", Group: "cats"),
Animal(Name: "D", Group: "cats"),
Animal(Name: "E", Group: "cats"),
Animal(Name: "E", Group: "cats"),
Animal(Name: "A", Group: "dogs"),
Animal(Name: "A", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "B", Group: "dogs"),
Animal(Name: "C", Group: "dogs"),
Animal(Name: "C", Group: "dogs"),
Animal(Name: "D", Group: "dogs"),
Animal(Name: "A", Group: "rats"),
Animal(Name: "A", Group: "rats"),
Animal(Name: "B", Group: "rats"),
Animal(Name: "D", Group: "rats")
]