как мне отсортировать 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
}
Другие вопросы по тегам