Как отсортировать список в SwiftUI, используя JSON - PullRequest
1 голос
/ 06 ноября 2019

У меня есть список, который мне нужно отсортировать по «популярности» (от более популярного к менее популярному), это значение происходит из JSON API. Есть ли функция сортировки по заданному значению в SwiftUI?

JSON выглядит так:

[
{
    "id": 1,
    "nombre": "The design of every day things",
    "autor": "Don Norman",
    "disponibilidad": true,
    "popularidad": 70,
    "imagen": "https://images-na.ssl-images-amazon.com/images/I/410RTQezHYL._SX326_BO1,204,203,200_.jpg"
},
{
    "id": 2,
    "nombre": "100 años de soledad",
    "autor": "Garcia Marquez",
    "disponibilidad": false,
    "popularidad": 43,
    "imagen": "https://images-na.ssl-images-amazon.com/images/I/51egIZUl88L._SX336_BO1,204,203,200_.jpg"
}
]

Это еще не все, это всего лишь часть. Популярность составляет popularidad.

. В настоящее время это мой список:

var body: some View {
    NavigationView {
        ScrollView {
            VStack(alignment: .leading) {
                ForEach(booksVM.books) { book in
                    HStack {
                        Text(book.nombre)
                        Spacer()
                    }
                    Text(book.autor)
                    Spacer()
                }
            }.padding(.leading, 5)
        }
    .navigationBarTitle("Bienvenido a la librería flux")
    .onAppear(perform: self.booksVM.fetchBooks)
    }
}

Пожалуйста, дайте мне знать, если для понимания этого требуется больше кода.

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете использовать .sorted для сортировки вашего массива.

Вот простой пример использования ваших данных. Это будет работать, если вы попробуете это на детской площадке.

let data = """
[
    {
        "id": 1,
        "nombre": "The design of every day things",
        "autor": "Don Norman",
        "disponibilidad": true,
        "popularidad": 70,
        "imagen": "https://images-na.ssl-images-amazon.com/images/I/410RTQezHYL._SX326_BO1,204,203,200_.jpg"
    },
    {
        "id": 2,
        "nombre": "100 años de soledad",
        "autor": "Garcia Marquez",
        "disponibilidad": false,
        "popularidad": 43,
        "imagen": "https://images-na.ssl-images-amazon.com/images/I/51egIZUl88L._SX336_BO1,204,203,200_.jpg"
    }
]
""".data(using: .utf8)!


struct Book: Codable {
    let id: Int
    let popularidad: Int
    let nombre: String
    let autor: String
    let disponibilidad: Bool
    let imagen: String
}

let decoder = JSONDecoder()
let books = try decoder.decode([Book].self, from: data)

let result = books.sorted {
    $0.popularidad > $1.popularidad
}

print(result)

Вам нужно просто выполнить сортировку, прежде чем использовать массив книг в ForEach

Так что все, что вам нужно сделать, - это следующее, которое отсортирует ваш массивBook объектов.

ForEach(booksVM.books.sorted { $0.popularidad > $1.popularidad}) { book in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...