This one's a little goofy!
Based on this question, I'm re-ordering an array of objects based on indices in another array:
// pop this in a playground:
struct DataObject {
let id: String
let name: String
let isRequired: Bool
init(_ id: String, _ name: String, _ isRequired: Bool) {
self.id = id
self.name = name
self.isRequired = isRequired
}
}
struct User {
let sortingIndex: [String]
init(_ sortingIndex: [String]) {
self.sortingIndex = sortingIndex
}
}
let a = [DataObject("1", "A", false), DataObject("2", "B", true), DataObject("3", "C", true), DataObject("4", "D", false)]
func sort(a: [DataObject], forUser user: User) -> [DataObject] {
return a.sort { user.sortingIndex.indexOf($0.id) < user.sortingIndex.indexOf($1.id) }
}
let user = User(["1", "2", "4", "3"])
sort(a, forUser: user)
The output look like this:
[{id "3", name "C", isRequired true}, {id "2", name "B", isRequired true}, {id "1", name "A", isRequired false}, {id "4", name "D", isRequired false}]
(mostly good!)
I want to prioritize the isRequired ones to be at the beginning of the array in alphabetical order, so I tried:
return a.sort { $0.isRequired ? $0.name < $1.name : user.sortingIndex.indexOf($0.id) < user.sortingIndex.indexOf($1.id) }
\\ ^
(which does nothing)
or:
return a.sort { $0.isRequired ? $0.name > $1.name : user.sortingIndex.indexOf($0.id) < user.sortingIndex.indexOf($1.id) }
\\ ^
(which works, but it's in reverse alphabetical order)
I want it to look like this in the end:
[
{id "2", name "B", isRequired true},
{id "3", name "C", isRequired true},
{id "1", name "A", isRequired false},
{id "4", name "D", isRequired false}
]