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

Swift iOS:如何加载数据至TableView并排除status为static的条目

解决TableView加载数据并过滤status为"static"条目的方案

我来帮你搞定这个需求,在Swift iOS开发中实现TableView加载数据并过滤掉status字段为"static"的条目,咱们可以分这几步来操作:

1. 先定义对应的数据模型(用Codable解析更省心)

因为返回的JSON里status和occurrence都是嵌套的字典结构,先定义对应的模型结构体,后续解析和操作数据会更清晰、更安全:

// 嵌套的Status模型,对应返回数据里的status字段
struct Status: Codable {
    let name: String
}

// 嵌套的Occurrence模型,对应返回数据里的occurrence字段
struct Occurrence: Codable {
    let name: String
}

// 主数据模型,对应每条任务数据
struct Task: Codable {
    let status: Status
    let sched: String
    let desc: String
    let id: Int
    let reward: Double
    let parent: String?
    let child: String?
    let dateCreated: String
    let name: String
    let occurrence: Occurrence
    let type: String?
    let dateModified: String
    
    // 处理JSON里的下划线命名(比如date_created)和模型属性的驼峰命名映射
    enum CodingKeys: String, CodingKey {
        case status, sched, desc, id, reward, parent, child
        case dateCreated = "date_created"
        case name, occurrence, type
        case dateModified = "date_modified"
    }
}

2. 数据请求与过滤逻辑

假设你已经通过网络请求拿到了返回的Data数据,先把它解析成Task数组,再用filter方法筛掉status.name为"static"的条目:

// 全局存储过滤后的任务数据
var filteredTasks: [Task] = []

// 解析并过滤数据的方法
func parseAndFilterTasks(from data: Data) -> [Task]? {
    do {
        // 把Data解析成Task数组
        let allTasks = try JSONDecoder().decode([Task].self, from: data)
        // 过滤掉status为static的条目
        let validTasks = allTasks.filter { $0.status.name != "static" }
        return validTasks
    } catch {
        print("数据解析失败:\(error.localizedDescription)")
        return nil
    }
}

// 示例网络请求方法
func fetchTasksFromServer() {
    guard let requestUrl = URL(string: "你的接口地址") else {
        print("URL格式错误")
        return
    }
    
    URLSession.shared.dataTask(with: requestUrl) { data, _, error in
        guard let data = data, error == nil else {
            print("网络请求失败:\(error?.localizedDescription ?? "未知错误")")
            return
        }
        
        // 解析过滤数据后更新UI
        if let tasks = self.parseAndFilterTasks(from: data) {
            DispatchQueue.main.async {
                self.filteredTasks = tasks
                self.tableView.reloadData()
            }
        }
    }.resume()
}

3. TableView数据源实现

把过滤后的数组绑定到TableView上,实现UITableViewDataSource的核心方法:

extension YourViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 返回过滤后的条目数量
        return filteredTasks.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 复用cell(记得提前在Storyboard或代码里注册cell)
        let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath)
        let currentTask = filteredTasks[indexPath.row]
        
        // 配置cell内容,示例:
        cell.textLabel?.text = currentTask.name
        cell.detailTextLabel?.text = "奖励:\(currentTask.reward) 积分"
        return cell
    }
}

额外小提示

如果你的项目暂时不想用Codable解析,直接操作字典数组的话,过滤逻辑可以这么写:

// 假设原始数据是[[String: Any]]类型
let rawTaskData: [[String: Any]] = 你的原始数据数组
let filteredDictData = rawTaskData.filter {
    // 取出status字典里的name字段,判断是否不等于static
    if let statusDict = $0["status"] as? [String: String],
       let statusName = statusDict["name"] {
        return statusName != "static"
    }
    // 如果status字段不存在或格式不对,直接过滤掉
    return false
}

不过还是更推荐用Codable方案,类型更安全,代码可读性和可维护性更高。

内容的提问来源于stack exchange,提问作者user9683424

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:54