как мне отсортировать NSMutableSet в Swift?
Я пытаюсь использовать NSMutableOrderedSet для хранения некоторых данных, но я хотел бы отсортировать набор по определенному атрибуту. Я попытался посмотреть в Интернете, как использовать функцию sort(компаратор cmptr: (Any, Any) -> ComparisonResult) NSMutableOrderedSet, но я не уверен, как это использовать. Я хотел бы знать, может ли кто-нибудь дать мне быстрый пример. Мне не удалось найти никаких руководств или примеров в документации для разработчиков Apple.
На данный момент у меня есть:
jersey.swift:
struct Jersey{
var name: String
var number: Int
}
viewcontroller.swift:
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)
var jerseySet = NSMutableOrderedSet()
jerseySet.addObject(firstBasemanJersey)
jerseySet.addObject(secondBasemanJersey)
jerseySet.addObject(thirdBasemanJersey)
jerseySet.addObject(catcherJersey)
Я хотел бы отсортировать набор по номеру футболки. Может ли кто-нибудь показать мне, как я могу использовать
self.something.sort { (<#Any#>, <#Any#>) -> ComparisonResult in
<#code#>
}
1 ответ
В самой простой форме вам просто нужно сравнить два аргумента (пара 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)
:
[Джерси. Джерси (имя: "Джон", номер: 1), Джерси. Джерси (имя: "Боб", номер: 5), Джерси. Джерси (имя: "Джим", номер: 15), Джерси. Джерси (имя: "Стив", номер: 79)]
И (по причинам, указанным в комментариях к вопросу) вот "более быстрая" версия этого:
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
}