У меня есть рабочее решение для ваших нужд. И, возможно, способ улучшить ваш код, стараясь избегать опций, когда в этом нет необходимости. Если ваш веб-сервис всегда будет возвращать имя и оценку для вашего объекта, то не используйте дополнительные функции, это облегчит вашу жизнь. В моём решении вы можете увидеть, что у меня нет опций, что код легче читать, а операции с ним тривиальны.
// -------------- 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
Надеюсь, это поможет