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

从JSON数组提取数据生成前菜、主菜、甜点三个分类数组

解决方案

没问题,我来帮你修改代码实现分类数组的生成~

首先,你需要在你的ViewController类中先定义三个用于存储分类菜品的数组:

// 在类的顶部添加这三个属性
var entres: [Meal] = []
var mainDishes: [Meal] = []
var desserts: [Meal] = []

接下来修改你的loadMeals方法,在解析完所有菜品后,通过filter方法根据course字段的值将菜品分配到对应的数组中:

func loadMeals() {
    Helpers.showActivityIndicator(activityIndicator, view)
    if let restaurantId = restaurant?.id {
        APIManager.shared.getMeals(restaurantId: restaurantId, completionHandler: { (json) in
            // 确保在主线程更新UI和数据(网络回调默认在后台线程)
            DispatchQueue.main.async {
                Helpers.hideActivityIndicator(self.activityIndicator)
                guard let json = json, let tempMeals = json["meals"].array else {
                    return
                }
                
                // 解析所有菜品到总数组
                self.meals = tempMeals.map { Meal(json: $0) }
                
                // 根据course字段分类到对应数组
                self.entres = self.meals.filter { $0.course.lowercased() == "entres" }
                self.mainDishes = self.meals.filter { $0.course.lowercased() == "main" }
                self.desserts = self.meals.filter { $0.course.lowercased() == "dessert" }
                
                self.tableView.reloadData()
            }
        })
    }
}

额外说明:

  1. 主线程更新:我加了DispatchQueue.main.async,因为网络请求的回调通常在后台线程,更新UI和数据源必须在主线程,避免崩溃或界面不更新的问题。
  2. lowercased():加上这个是为了避免大小写不一致导致的匹配失败(比如JSON里的course是小写,而你的Meal模型里如果是大写的话也能匹配),如果你的Meal模型中course字段已经和JSON完全一致,也可以去掉这个调用。
  3. TableView数据源适配:如果你的tableView是分组样式,你可以这样实现数据源方法:
override func numberOfSections(in tableView: UITableView) -> Int {
    return 3
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return entres.count
    case 1:
        return mainDishes.count
    case 2:
        return desserts.count
    default:
        return 0
    }
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MealCell", for: indexPath) as! MealCell
    
    let meal: Meal
    switch indexPath.section {
    case 0:
        meal = entres[indexPath.row]
    case 1:
        meal = mainDishes[indexPath.row]
    case 2:
        meal = desserts[indexPath.row]
    default:
        meal = meals[0] // 兜底处理,实际不会走到这里
    }
    
    // 配置cell的内容,比如cell.nameLabel.text = meal.name等
    cell.configure(with: meal)
    return cell
}

// 可以添加section标题
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    switch section {
    case 0:
        return "Entres"
    case 1:
        return "Main"
    case 2:
        return "Dessert"
    default:
        return nil
    }
}

内容的提问来源于stack exchange,提问作者Doing Things Occasionally

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:43:57