В самой базовой форме c вам просто нужно сравнить два аргумента (пару Any
объектов, поскольку Set не «знает», какие объекты в данный момент удерживаются) и вернуть ComparisonResult
, который может будь либо orderedAscending
, orderedDescending
или orderedSame
:
jerseySet.sort(comparator: { lhs, rhs in
guard let (l, r) = (lhs, rhs) as? (Jersey, Jersey) else { return .orderedSame }
guard l.number != r.number else { return .orderedSame }
return l.number < r.number ? .orderedAscending : .orderedDescending
})
сейчас, если ты print(jerseySet.array)
:
[Jerseys.Jersey (имя: "Джон", номер: 1), Jerseys.Jersey (имя: "Bob", номер: 5), Jerseys.Jersey (имя: "Jim", номер: 15), Jerseys.Jersey (имя: "Steve", номер: 79)]
И (по причинам, указанным в комментариях к вопросу), вот «Swiftier» версия этого:
struct Jersey: Hashable {
let name: String
let number: Int
}
let firstBasemanJersey = Jersey(name: "Bob", number: 5)
let secondBasemanJersey = Jersey(name: "Jim", number: 15)
let thirdBasemanJersey = Jersey(name: "Jon", number: 1)
let catcherJersey = Jersey(name: "Steve", number: 79)
// Kept as var assuming that you will later `.insert` things in the set
var jerseySet = Set([
firstBasemanJersey,
secondBasemanJersey,
thirdBasemanJersey,
catcherJersey
])
let sortedByNumber = jerseySet.sorted { lhs, rhs in
lhs.number < rhs.number
}