如何在 SwiftUI 中通过其 id 解析 API 中的值

How to parse value from API by its id in SwiftUI

我与 this API 一起工作,我想出了如何解析其中的所有数据,除了一个值——有效负载重量。问题是我必须通过 id – “leo” 来解析它,但我不知道该怎么做。

这是我的代码:

// MARK: - API
class InfoApi {
    func getRockets(completion: @escaping ([RocketInfo]) -> ()) {
        guard let url = URL(string: "https://api.spacexdata.com/v4/rockets") else {
            return
        }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            do {
                let rocketsInfo = try JSONDecoder().decode([RocketInfo].self, from: data!)
                DispatchQueue.main.async {
                    completion(rocketsInfo)
                }
            } catch {
                print(error.localizedDescription)
            }
        }
        .resume()
    }
}

// MARK: - MODEL
struct RocketInfo: Codable, Identifiable {
    let id = UUID()
    let name: String
    let firstFlight: String
    let country: String
    let costPerLaunch: Int
    let firstStage: StageInfo
    let payloadWeights: [Payload]
    
    enum CodingKeys: String, CodingKey {
        case id
        case name
        case firstFlight = "first_flight"
        case country
        case costPerLaunch = "cost_per_launch"
        case firstStage = "first_stage"
        case payloadWeights = "payload_weights"
    }
    
    // MARK: - STAGE
    struct StageInfo: Codable {
        let engines: Int
        let fuelAmountTons: Double
        let burnTimeSec: Int?
        
        enum CodingKeys: String, CodingKey {
            case engines
            case fuelAmountTons = "fuel_amount_tons"
            case burnTimeSec = "burn_time_sec"
        }
        
        static let firstStage = StageInfo(engines: 1, fuelAmountTons: 44.3, burnTimeSec: 169)
        static let secondStage = StageInfo(engines: 1, fuelAmountTons: 3.30, burnTimeSec: 378)
    }
    
    // MARK: - PAYLOAD
    struct Payload: Codable {
        let id: String
        let kg: Int
        let lb: Int
        
        static let payloadWeights = Payload(id: "leo", kg: 450, lb: 992)
    }
    
    // MARK: - EXAMPLE
    static let example = RocketInfo(name: "Falcon 1", firstFlight: "2006-03-24", country: "Republic of the Marshall Islands", costPerLaunch: 6700000, firstStage: StageInfo.firstStage, payloadWeights: [Payload.payloadWeights])
}

// MARK: - CONTENT VIEW
struct ParametersView: View {
    @State var rockets: [RocketInfo] = []
    
    var body: some View {
        List(rockets) { rocket in
            VStack(spacing: 20) {
                HStack {
                    Text("First flight of \(rocket.name)")
                    Spacer()
                    Text("\(rocket.firstFlight)")
                }
                HStack {
                    Text("Payload of \(rocket.name)")
                    Spacer()
                    Text("\(rocket.payloadWeights[0].kg)") //<-- Here I try to parse a payload weight value
                }
            }
        }
        .onAppear {
            InfoApi().getRockets { rockets in
                self.rockets = rockets
            }
        }
    }
}

// MARK: - PREVIEW
struct ParametersView_Previews: PreviewProvider {
    static var previews: some View {
        ParametersView()
    }
}

我可以通过指向 API 中有效载荷数组的第一个元素的索引来访问 有效载荷权重 值,但我想弄清楚如何获得这个值由特殊 id – “Leo”。

在 API 中看起来是这样的:

可以使用first(where:)搜索数组,return第一个匹配条件的元素(在本例中,匹配某个id):

if let leo = rocket.payloadWeights.first(where: { [=10=].id == "leo" }) {
    Text("\(leo.kg)") //<-- Here I try to parse a payload weight value
}