If you want to preserve the order that you get from a server I will suggest you not using sort
or sorted
method, because they are not guaranteed to preserve original order for keys with the same order. I will recommend you to write own sorting-like function:
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)
]
*/
If you don't want to create Comparable
extension to your model (because for example, you are using a different order of these models in a few places), you can use method sorted
, but provide a different sorting block:
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)
and the sorting order will be:
[
Model(title: "a", selected: true),
Model(title: "c", selected: true),
Model(title: "a", selected: false),
Model(title: "b", selected: false)
]