Swift中创建结构体整合燃油数据数组并实现站点ID匹配查询
解决方案
1. 定义整合数据的结构体
先创建两个结构体,分别封装单种燃油信息和对应站点的完整燃油数据:
// 封装单种燃油的类型与价格 struct FuelGrade { let type: String let price: Double } // 封装单个站点的ID及其所有燃油信息 struct StationFuelInfo { let stationID: String let fuelGrades: [FuelGrade] }
2. 替换原有独立数组
移除原来的三个分散数组,改用结构体数组存储数据:
var stationFuelInfos: [StationFuelInfo] = []
3. 修改API数据填充逻辑
在MapVC的API回调中,直接将接口返回的数据封装为StationFuelInfo对象并加入数组,从根源避免索引不匹配问题:
WalletService.shared.locateAndCheckinToNearestStore(toExplicitLocation: CLLocation(latitude: station.lat, longitude: station.long)) { storee, error in WalletService.shared.getSiteDetails { siteDetails, error in guard let fuelGrades = siteDetails?.fuelGrades else { return } // 转换API返回的燃油数据为自定义结构体数组 let convertedFuelGrades = fuelGrades.compactMap { fuelGrade in guard let type = fuelGrade.fuelType, let price = fuelGrade.price else { return nil } return FuelGrade(type: type, price: price) } // 创建当前站点的燃油信息对象并加入数组 let stationFuelInfo = StationFuelInfo( stationID: station.id, fuelGrades: convertedFuelGrades ) self?.stationFuelInfos.append(stationFuelInfo) } }
4. 根据站点ID匹配数据
用户选中站点后,直接通过selectedStation?.id在结构体数组中定位对应数据:
if let selectedStationID = selectedStation?.id { // 查找目标站点的燃油信息 if let targetFuelInfo = stationFuelInfos.first(where: { $0.stationID == selectedStationID }) { // 提取该站点的所有燃油类型与价格 let fuelTypes = targetFuelInfo.fuelGrades.map { $0.type } let fuelPrices = targetFuelInfo.fuelGrades.map { $0.price } // 此处可将数据传递至下一页面 // 示例:nextVC.fuelTypes = fuelTypes; nextVC.fuelPrices = fuelPrices } }
方案优势
原有三个独立数组存在索引错位风险:一个站点可能对应多种燃油类型,导致storeFuelGradesTypes和storeFuelGradesPrice的元素数量远多于storeFuelGradesID,无法通过ID直接关联数据。结构体数组将站点ID与对应燃油信息封装为整体,从根本上保证了数据的关联性,查找时无需依赖索引,直接通过ID匹配即可。
内容的提问来源于stack exchange,提问作者ZeroCooL
相关产品推荐
相关产品推荐

