Швидкий перехід від 2 до 4
Оригінальна відповідь прагнула сортувати масив користувацьких об’єктів за допомогою деякої властивості. Нижче я покажу вам декілька зручних способів зробити таку саму поведінку під швидкими структурами даних!
Невеликі речі не вийшли з ладу, я так незначно змінив ImageFile. Зважаючи на це, я створюю масив із трьох файлів зображень. Зауважте, що метадані - необов'язкове значення, очікується перехід у нуль як параметр.
struct ImageFile {
var name: String
var metadata: String?
var size: Int
}
var images: [ImageFile] = [ImageFile(name: "HelloWorld", metadata: nil, size: 256), ImageFile(name: "Traveling Salesmen", metadata: "uh this is huge", size: 1024), ImageFile(name: "Slack", metadata: "what's in this stuff?", size: 2048) ]
ImageFile має властивість з назвою розмір. На наступних прикладах я покажу вам, як використовувати операції сортування з властивостями, такими як розмір.
від найменшого до найбільшого розміру (<)
let sizeSmallestSorted = images.sorted { (initial, next) -> Bool in
return initial.size < next.size
}
найбільший до найменшого (>)
let sizeBiggestSorted = images.sorted { (initial, next) -> Bool in
return initial.size > next.size
}
Далі будемо сортувати за допомогою імені властивості String. Таким же чином використовуйте сортування для порівняння рядків. Але зауважте, внутрішній блок повертає результат порівняння. Цей результат визначатиме сортування.
AZ (. Упорядкований по зростанню)
let nameAscendingSorted = images.sorted { (initial, next) -> Bool in
return initial.name.compare(next.name) == .orderedAscending
}
ZA (. Упорядковано спадаючий)
let nameDescendingSorted = images.sorted { (initial, next) -> Bool in
return initial.name.compare(next.name) == .orderedDescending
}
Далі - мій улюблений спосіб сортування, у багатьох випадках один матиме необов’язкові властивості. Тепер не хвилюйтеся, ми будемо сортувати таким же чином, як вище, за винятком того, що нам доведеться обробляти нуль! У виробництві;
Я використовував цей код, щоб змусити останні екземпляри в моєму масиві з нульовими значеннями властивості бути останніми. Потім упорядкуйте метадані, використовуючи припущені розпаковані значення.
let metadataFirst = images.sorted { (initial, next) -> Bool in
guard initial.metadata != nil else { return true }
guard next.metadata != nil else { return true }
return initial.metadata!.compare(next.metadata!) == .orderedAscending
}
Можливий варіант вторинного сортування для необов'язкових. Наприклад; можна було показати зображення з метаданими та упорядкованими за розміром.