Swift сортирует массив объектов на основе логического значения
Я ищу способ сортировки массива Swift на основе логического значения.
У меня есть работа с использованием приведения в NSArray:
var boolSort = NSSortDescriptor(key: "selected", ascending: false)
var array = NSArray(array: results)
return array.sortedArrayUsingDescriptors([boolSort]) as! [VDLProfile]
Но я ищу вариант Swift, любые идеи?
Обновление
Благодаря Arkku мне удалось исправить это, используя следующий код:
return results.sorted({ (leftProfile, rightProfile) -> Bool in
return leftProfile.selected == true && rightProfile.selected != true
})
Ответы
Ответ 1
Массивы Swift можно сортировать на месте с помощью sort
или с новым массивом с sorted
. Единственным параметром любой функции является замыкание, принимающее два элемента и возвращающее true
, если первое упорядочено до второго. Самый короткий способ использовать параметры закрытия - это указать их как $0
и $1
.
Например (чтобы сначала отсортировать истинные булевы):
// In-place:
array.sort { $0.selected && !$1.selected }
// To a new array:
array.sorted { $0.selected && !$1.selected }
(изменить: обновлено для Swift 3 и 4, ранее sort
было sortInPlace
и sorted
было sort
.)
Ответ 2
Стандартная библиотека Swifts предоставляет функцию с именем sorted, которая сортирует массив значений известного типа на основе вывода закрытия сортировки, которое вы предоставляете
reversed = sorted(array) { $0 > $1 }
reversed
будет новый массив, который будет сортироваться в соответствии с условием, указанным в закрытии.
Ответ 3
Новый (для Swift 1.2)
return results.sort { $0.selected && !$1.selected }
Старый (для Swift 1.0)
Предполагая, что results
имеет тип [VDLProfile]
, а VDLProfile имеет член Bool
selected
:
return results.sorted { $0.selected < $1.selected }
См. документацию для отсортировано