You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift开发中如何映射嵌套JSON响应中的delivery_fee_types数组?

Got it, let's tackle mapping the delievery_fee_types array from your JSON response. Here's a step-by-step solution that's safe and clean:

Solution to Map delievery_fee_types from JSON Response

1. Create a Model for Delivery Fee Types

First, make a dedicated class to hold each delivery fee type's data. This keeps your code organized and type-safe, avoiding messy nested dictionary access later:

class DeliveryFeeType {
    var deliveryFee: Double = 0.0
    var deliveryFeeType: Int = 0
    var fromTime: Int = 0
    var fromTimeStr: String = ""
    var message: String = ""
    var title: String = ""
    var toTime: Int = 0
    var toTimeStr: String = ""
    
    // Initializer to populate data from a dictionary
    init?(dict: [String: Any]) {
        // Safely unwrap and cast each required field
        guard let fee = dict["delievery_fee"] as? Int,
              let type = dict["delievery_fee_type"] as? Int,
              let fromT = dict["from_time"] as? Int,
              let fromTStr = dict["from_time_str"] as? String,
              let msg = dict["message"] as? String,
              let title = dict["title"] as? String,
              let toT = dict["to_time"] as? Int,
              let toTStr = dict["to_time_str"] as? String else {
            return nil // Skip invalid entries instead of crashing
        }
        
        self.deliveryFee = Double(fee)
        self.deliveryFeeType = type
        self.fromTime = fromT
        self.fromTimeStr = fromTStr
        self.message = msg
        self.title = title
        self.toTime = toT
        self.toTimeStr = toTStr
    }
}

2. Add an Array Property to Your Main Class

In the class where your deserilize method lives, add a property to store the collection of delivery fee types:

var deliveryFeeTypes: [DeliveryFeeType] = []

3. Update the deserilize Method to Parse the Array

Modify your existing method to handle the delievery_fee_types array. I've also updated the existing field mappings to use safe casting (no more as! which can crash if data is missing):

mutating func deserilize(values: Dictionary<String, Any>?) {
    guard let dataDict = values else { return }
    
    // Map top-level fields with safe casting and defaults
    deliveryFee = Double(dataDict["delievery_fee"] as? Int ?? 0)
    total = Double(dataDict["total"] as? String ?? "0.0") ?? 0.0
    discount = Double(dataDict["discount"] as? Int ?? 0)
    cartCount = Double(dataDict["cart_count"] as? String ?? "0.0") ?? 0.0
    del_fee_popup = (dataDict["del_fee_popup"] as? Int ?? 0) == 1
    
    // Parse the delivery fee types array
    if let feeTypesArray = dataDict["delievery_fee_types"] as? [[String: Any]] {
        // CompactMap filters out any invalid entries where the model init returns nil
        deliveryFeeTypes = feeTypesArray.compactMap { DeliveryFeeType(dict: $0) }
    }
}

Key Safety Improvements

  • Replaced risky forced casts (as!) with optional casts (as?) and default values to prevent crashes if fields are missing or mistyped.
  • Used compactMap to skip any invalid entries in the delievery_fee_types array instead of crashing the whole parse.
  • Handled string-to-double conversions for fields like total and cart_count since they're stored as strings in your JSON.

内容的提问来源于stack exchange,提问作者As If Prince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:02:51