从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() } }) } }
额外说明:
- 主线程更新:我加了
DispatchQueue.main.async,因为网络请求的回调通常在后台线程,更新UI和数据源必须在主线程,避免崩溃或界面不更新的问题。 - lowercased():加上这个是为了避免大小写不一致导致的匹配失败(比如JSON里的course是小写,而你的Meal模型里如果是大写的话也能匹配),如果你的Meal模型中
course字段已经和JSON完全一致,也可以去掉这个调用。 - 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
相关产品推荐
相关产品推荐

