избегать принудительного разворачивания внутри закрытия сортировки в Swift - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь отсортировать массив объектов на основе необязательного свойства Int.

// sorting each language array based on most stars
groupedDictionariesValueUnwrapped.sort(by: { $0.stars! > $1.stars!  })

Тип массива: [SingleRepository], а SingleRepository имеет необязательный Int. звезды: Инт?

Как мне избежать распаковки внутри сорта?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Если это имеет смысл для вашего класса / структуры, вы можете добавить соответствие Comparable к типу, который хотите отсортировать:

extension MyClass: Comparable {
    public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
        return (lhs.stars ?? 0) == (rhs.stars ?? 0)
    }

    public static func <(lhs: MyClass, rhs: MyClass) -> Bool {
        return (lhs.stars ?? 0) < (rhs.stars ?? 0)
    }
}

После этого вы сможете напрямую использовать > операторная функция (соответствующая Comparable вызывает все остальные операторы сравнения >, >=, <=):

groupedDictionariesValueUnwrapped.sort(by: >)

Под "осмыслением" я имею в виду тот факт, чтосоответствие Comparable на основе свойства stars добавляет значение к определению типа (например, тип называется Rating и содержит информацию о проверке пользователя).

0 голосов
/ 26 августа 2018

Вы сортируете в порядке убывания.

Используйте оператор nil coalescing ??, чтобы безопасно развернуть значения и заменить nil на Int.min, чтобы поместить элементы в конец массива:

// sorting each language array based on most stars
groupedDictionariesValueUnwrapped.sort(by: { ($0.stars ?? Int.min) > ($1.stars ?? Int.min) })

или используйте ?? Int.max, чтобы поместить их в начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...