Как мне отсортировать NSMutableSet в Swift? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь использовать NSMutableOrderedSet для хранения некоторых данных, но я бы хотел отсортировать набор по заданному атрибуту c. Я пытался посмотреть в Интернете о том, как использовать функцию сортировки (компаратор 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)

Я бы хотел отсортировать набор по jersey.number, чтобы кто-нибудь смог показать мне, как я буду использовать

self.something.sort { (<#Any#>, <#Any#>) -> ComparisonResult in
            <#code#>
        }

1 Ответ

0 голосов
/ 08 марта 2020

В самой базовой форме 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...