I performed a GET request, and I saved data inside data like this
if let data: [MyMap] = response?.results {
let var_to_sort = data
self.generateStuff(var: var_to_sort)
}
MyMap is a mappable object defined like this:
class MyMap: NSCoding {
var name: String?
var score: Score?
...
With mapping, encode etc... Score is the same as the one above:
class Score:NSCoding {
var number: Double?
...
What I need is to sort var_to_sort = data based on number (from greatest to leasts) and pass it to the generateStuff method. Remember that response.results has more than 1 object. Someone can help me?
Simply sort your array:
let var_to_sort = data.sorted {
$0.score?.number ?? 0 > $1.score?.number ?? 0
}
I do have a working solution for your need. And possibly a way to improve your code by trying to avoid optionals when there's no need for it. If you're webservice will always return a name and score for your object then don't use optionals, this will make your life easier. You can see in my solution when I don't have any optional that the code is way easier to read and operation like that are trivial.
// -------------- Solution 1 avoiding optionals ----------------
struct MyObject {
var name: String
var score: Score
}
struct Score {
var number: Double
}
let data: [MyObject] = [MyObject(name: "obj1", score: Score(number: 12)),
MyObject(name: "obj2", score: Score(number: 2)),
MyObject(name: "obj3", score: Score(number: 24)),
MyObject(name: "obj4", score: Score(number: 4)),
MyObject(name: "obj5", score: Score(number: 1))]
let sortedObj = data.sorted(by: { $0.score.number > $1.score.number })
print(sortedObj)
// Print: obj3, obj1, obj4, obj2 and obj5
// -------------- Solution 2 using optionals ----------------
struct MyObject2 {
var name: String?
var score: Score2?
}
struct Score2 {
var number: Double?
}
let data2: [MyObject2] = [MyObject2(name: "obj1", score: Score2(number: 12)),
MyObject2(name: "obj2", score: Score2(number: 2)),
MyObject2(name: "obj3", score: Score2(number: 24)),
MyObject2(name: "obj4", score: Score2(number: 4)),
MyObject2(name: "obj5", score: Score2(number: 1))]
let sortedObj2 = data2.sorted(by: {
guard let num1 = $0.score?.number, let num2 = $1.score?.number else {
return false
}
return num1 > num2
})
print(sortedObj2)
// Print: obj3, obj1, obj4, obj2 and obj5
Hope this helps
Sort your array this way.
data2.sort(by:{$0.score?.number > $1.score?.number})
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.