如何在 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
}
我与 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
}