如何将API返回的MBFuelGrades数组中fuelType与price存入独立数组?
问题:拆分数组元素到两个独立数组
我在存储数组信息时遇到疑问,我的API调用代码如下:
WalletService.shared.getSiteDetails { siteDetails, error in }
siteDetails会返回解析后的JSON数据,其中包含的一项数据为:
public let fuelGrades: [MBFuelGrades]?
MBFuelGrades的结构如下:
public struct MBFuelGrades: Codable { public let fuelType: String? public let price: Double? public let priceTier: String? }
API响应后,打印得到的fuelGrades数组可能包含多个元素,示例如下:
po siteDetails?.fuelGrades ▿ Optional<Array<MBFuelGrades>> ▿ some : 1 element ▿ 0 : MBFuelGrades ▿ fuelType : Optional<String> - some : "REGULAR" ▿ price : Optional<Double> - some : 1.339 ▿ priceTier : Optional<String> - some : "CREDIT"
我想要将其中的fuelType和price分别存入以下两个独立数组中:
var fuelGradesTypes: [String] = [""] var fuelGradesPrice: [Double] = [0.0]
请问该如何实现将对应元素存入这两个数组中?
解决方案
你可以在API回调闭包中,先对可选的fuelGrades数组解包,再提取目标字段。需要注意处理fuelType和price自身的可选性,避免存入空值。另外你初始化的数组带有默认值,可根据需求选择清空或保留:
方式一:手动遍历处理
WalletService.shared.getSiteDetails { siteDetails, error in // 清空初始默认值(不需要保留则执行) self.fuelGradesTypes.removeAll() self.fuelGradesPrice.removeAll() // 解包可选数组,为空则直接返回 guard let fuelGrades = siteDetails?.fuelGrades else { return } // 遍历数组提取非空字段 for grade in fuelGrades { if let type = grade.fuelType { self.fuelGradesTypes.append(type) } if let price = grade.price { self.fuelGradesPrice.append(price) } } }
方式二:使用compactMap简化代码
compactMap会自动过滤空值,直接生成非可选的元素数组,写法更简洁:
WalletService.shared.getSiteDetails { siteDetails, error in // 解包数组后直接赋值 guard let fuelGrades = siteDetails?.fuelGrades else { return } // 替换原有数组 self.fuelGradesTypes = fuelGrades.compactMap { $0.fuelType } self.fuelGradesPrice = fuelGrades.compactMap { $0.price } // 如果需要保留初始默认值,改用append添加 // self.fuelGradesTypes.append(contentsOf: fuelGrades.compactMap { $0.fuelType }) // self.fuelGradesPrice.append(contentsOf: fuelGrades.compactMap { $0.price }) }
注意点
- 必须先对
siteDetails?.fuelGrades解包,否则无法遍历数组; compactMap会自动剔除nil值,确保最终数组里的元素都是非空的;- 若初始数组的默认值(
[""]和[0.0])需要保留,使用append(contentsOf:)替代直接赋值即可。
内容的提问来源于stack exchange,提问作者ZeroCooL
相关产品推荐
相关产品推荐

