Если вы хотите сохранить порядок, полученный с сервера, я предлагаю вам не использовать метод sort
или sorted
, поскольку они не гарантируют сохранение исходного порядка для ключей с таким же порядком.Я рекомендую вам написать собственную сортирующую функцию:
struct Model {
let title:String
let selected:Bool
}
let array = [ Model(title: "Z", selected: true), Model(title: "Z", selected: false), Model(title: "Y", selected: false), Model(title: "P", selected: false), Model(title: "A", selected: true), Model(title: "A", selected: false)]
extension Array where Element == Model {
func preserveSorted() -> [Model] {
var selected:[Model] = []
var notSelected:[Model] = []
for model in self {
if model.selected {
selected.append(model)
} else {
notSelected.append(model)
}
}
var output:[Model] = []
output.append(contentsOf: selected)
output.append(contentsOf: notSelected)
return output
}
}
var newArray:[Model] = array.preserveSorted()
print(newArray)
/* output:
[
Model(title: "Z", selected: true),
Model(title: "A", selected: true),
Model(title: "Z", selected: false),
Model(title: "Y", selected: false),
Model(title: "P", selected: false),
Model(title: "A", selected: false)
]
*/
Если вы не хотите создавать расширение Comparable
для вашей модели (потому что, например, вы используете другой порядокиз этих моделей в нескольких местах), вы можете использовать метод sorted
, но предоставить другой блок сортировки:
struct Model {
let title:String
let selected:Bool
}
let array = [ Model(title: "a", selected: true), Model(title: "a", selected: false), Model(title: "b", selected: false), Model(title: "c", selected: true)]
let newArray = array.sorted { (lhs, rhs) -> Bool in
if lhs.selected == rhs.selected {
return lhs.title < rhs.title
}
return lhs.selected
}
print(newArray)
, и порядок сортировки будет:
[
Model(title: "a", selected: true),
Model(title: "c", selected: true),
Model(title: "a", selected: false),
Model(title: "b", selected: false)
]