如何使用 JSON 在 SwiftUI 中对列表进行排序

haw*_*weg 5 swiftui

我有一个列表,我需要按“流行度”(更流行到不太流行)排序,这个值来自 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"
}
]
Run Code Online (Sandbox Code Playgroud)

还有更多,这只是其中的一部分。人气是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)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要更多代码来理解这一点,请告诉我。

And*_*rew 9

您可以.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)
Run Code Online (Sandbox Code Playgroud)

在使用书籍数组之前,您只需执行排序 ForEach

因此,您所要做的就是对您的Book对象数组进行排序。

ForEach(booksVM.books.sorted { $0.popularidad > $1.popularidad}) { book in
Run Code Online (Sandbox Code Playgroud)