Sorted Array / Map Swift - PullRequest
       27

Sorted Array / Map Swift

0 голосов
/ 10 апреля 2020

Я выполнил запрос GET и сохранил данные внутри data вот так

if let data: [MyMap] = response?.results {
   let var_to_sort = data
   self.generateStuff(var: var_to_sort)
}

MyMap - это сопоставимый объект, определенный следующим образом:

class MyMap: NSCoding {
   var name: String?
   var score: Score?
   ...

С отображением, закодировать и c ... Оценка совпадает с приведенной выше:

class Score:NSCoding {
   var number: Double?
   ...

Мне нужно отсортировать var_to_sort = data на основе числа (от наибольшего до наименьшего) и передайте его методу generateStuff . Помните, что response.results имеет более 1 объекта. Кто-то может мне помочь?

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

У меня есть рабочее решение для ваших нужд. И, возможно, способ улучшить ваш код, стараясь избегать опций, когда в этом нет необходимости. Если ваш веб-сервис всегда будет возвращать имя и оценку для вашего объекта, то не используйте дополнительные функции, это облегчит вашу жизнь. В моём решении вы можете увидеть, что у меня нет опций, что код легче читать, а операции с ним тривиальны.

// -------------- 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

Надеюсь, это поможет

0 голосов
/ 10 апреля 2020

Сортируйте массив таким образом.

data2.sort(by:{$0.score?.number > $1.score?.number})
0 голосов
/ 10 апреля 2020

Просто отсортируйте ваш массив:

let var_to_sort = data.sorted {
  $0.score?.number ?? 0 > $1.score?.number ?? 0
}
...