Sort custom objects by property in Swift

Needone App
2 min readFeb 17, 2023

--

Many of us have met the situation that we have an array/list of custom objects, and we want them can be sorted in a specific order. For example, we are have a group of people, and we want to sort the whole array by the person’s age.

struct Person {
let firstName: String
let lastName: String
let age: Int
}

var people = [Person(firstName: "John", lastName: "Smith", age: 25),
Person(firstName: "Jane", lastName: "Doe", age: 35),
Person(firstName: "Bob", lastName: "Jones", age: 20)]

let sortedPeople = people.sorted { $0.age < $1.age }
// output
[__lldb_expr_3.Person(firstName: "Bob", lastName: "Jones", age: 20), __lldb_expr_3.Person(firstName: "John", lastName: "Smith", age: 25), __lldb_expr_3.Person(firstName: "Jane", lastName: "Doe", age: 35)]

Sort objects by a custom property

Note that we can sort the Person struct above easily due to its properties are all in prime type. What about custom property, see the example:

let people = [Person(firstName: "John", lastName: "Smith", age: 25),
Person(firstName: "Jane", lastName: "Doe", age: 35),
Person(firstName: "Bob", lastName: "Jones", age: 20)]

let sortedPeople = people.sorted { $0.age < $1.age }
print(sortedPeople)

let companies = [
Company(name: "A", ceo: people[0]),
Company(name: "B", ceo: people[1]),
Company(name: "C", ceo: people[2])
]
let sortedCompanies = companies.sorted { $0.ceo < $1.ceo }
print(sortedCompanies)

If we run the above code we will get the error:

Referencing operator function '<' on 'Comparable' requires that 'Person' conform to 'Comparable'

The compiler indicated that we need our Person to conform the Comparable protocol (For more details on the Equatable and Comparable in Swift):

struct Person: Comparable {

let firstName: String
let lastName: String
let age: Int

static func < (lhs: Person, rhs: Person) -> Bool {
lhs.age < rhs.age
}
}struct Person: Comparable { let firstName: String let lastName: String let age: Int static func < (lhs: Person, rhs: Person) -> Bool { lhs.age < rhs.age } }

Now if we rerun the code, we will get a sorted company array based on the ceo property:

[__lldb_expr_7.Company(name: "C", ceo: __lldb_expr_7.Person(firstName: "Bob", lastName: "Jones", age: 20)),

__lldb_expr_7.Company(name: "A", ceo: __lldb_expr_7.Person(firstName: "John", lastName: "Smith", age: 25)),

__lldb_expr_7.Company(name: "B", ceo: __lldb_expr_7.Person(firstName: "Jane", lastName: "Doe", age: 35))]

Originally published at https://needone.app on February 17, 2023.

👉 If you want received more stories like this, please subscribe my channel to get the latest update in time

--

--