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

Swift 5中如何将接口返回的JSON数组赋值给ViewModel的数组

问题解决方案

核心问题说明

你当前的代码中,eventService.getEvents的回调参数result枚举的.success状态关联值就是已经解析完成的[EventModel]数组,你之前用下划线忽略了这个值,所以无法完成赋值。

修改后的ViewModel代码

class EventViewModel {
    private var eventService = EventService()
    // 修改访问权限为private(set),外部可读、内部可写,符合封装要求
    private(set) var eventsArray = [EventModel]()

    func fetchEventsData(completion: @escaping () -> ()) {
        eventService.getEvents { [weak self] (result) in
            guard let self = self else { return }
            switch result {
            // 取出success关联的解析后数组
            case .success(let eventModels):
                // 直接赋值即可
                self.eventsArray = eventModels
                completion()
            case .failure(let error):
                print("Error processing json data: \(error)")
                // 可选:错误场景也触发回调,上层可以做空态、错误提示展示
                completion()
            }
        }
    }
}

上层ViewController调用示例(用于UITableView刷新)

class EventViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    let viewModel = EventViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        // 触发网络请求
        viewModel.fetchEventsData { [weak self] in
            // 数据赋值完成,刷新列表
            self?.tableView.reloadData()
        }
    }
}

extension EventViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.eventsArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "EventCell", for: indexPath) as! EventCell
        let model = viewModel.eventsArray[indexPath.row]
        // 给cell控件赋值
        cell.titleLabel.text = model.title
        cell.subtitleLabel.text = model.subtitle
        // 其他属性赋值逻辑自行补充
        return cell
    }
}

注意事项

  • 原网络请求解析代码中已经把回调切到了主队列,所以上层completion里直接刷新UI不需要再切线程
  • private(set)修饰eventsArray既保证了数据只能在ViewModel内部修改,又能让上层拿到数据渲染UI,符合MVVM的封装规范
  • 如果需要支持上拉加载更多,赋值时可以改成self.eventsArray.append(contentsOf: eventModels),不需要全量覆盖

内容的提问来源于stack exchange,提问作者P-J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:00:05