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

iOS Swift中如何结构化API数据实现TableView按日期分组

Swift实现按日期分组预约数据(适配TableView多节展示)

需求说明

我从API获取了如下格式的Appointments数据:

[ 
 Appointments(startTime:"2022-09-01",subject:"Clinic Appointment",activityid:"2343"),
  Appointments(startTime:"2022-09-01",subject:"Night Appointment",activityid:"5738"),
  Appointments(startTime:"2022-09-01",subject:"Regular checkup",activityid:"2975"),
  Appointments(startTime:"2022-09-02",subject:"High Fever",activityid:"9274"),
  Appointments(startTime:"2022-09-02",subject:"Virtual checkup",activityid:"5648"),
  Appointments(startTime:"2022-09-03",subject:"Regular Appointment",activityid:"1892")
]

同时有一个包含当月所有日期的数组,需要将数据按startTime字段分组到对应日期,生成如下格式的AppointmentsByDates数组(无预约的日期对应空数组),用于TableView的多节展示:

[ 
   AppointmentsByDates(title:"2022-09-01" , appointments: [
        Appointments(startTime:"2022-09-01",subject:"Night Appointment",activityid:"5738"),
        Appointments(startTime:"2022-09-01",subject:"Regular checkup",activityid:"2975"),
        Appointments(startTime:"2022-09-01",subject:"Clinic Appointment",activityid:"2343"),
      ]),
   AppointmentsByDates(title:"2022-09-02" , appointments: [
        Appointments(startTime:"2022-09-02",subject:"High Fever",activityid:"9274"),
        Appointments(startTime:"2022-09-02",subject:"Virtual checkup",activityid:"5648"),
      ]),
   AppointmentsByDates(title:"2022-09-03" , appointments: [
        Appointments(startTime:"2022-09-03",subject:"Regular Appointment",activityid:"1892")
      ]),
   AppointmentsByDates(title:"2022-09-04" , appointments: []),
   AppointmentsByDates(title:"2022-09-05" , appointments: []),
   ...
   AppointmentsByDates(title:"2022-09-30" , appointments: []),
]

Swift实现方案

1. 定义数据模型

先创建对应的数据结构体,适配API返回格式:

// 单个预约模型
struct Appointment: Codable {
    let startTime: String
    let subject: String
    let activityid: String
}

// 按日期分组后的容器模型
struct AppointmentsByDate {
    let title: String
    let appointments: [Appointment]
}

2. 对预约数据按日期分组

利用Swift原生的字典分组方法,把API返回的预约数组转换成以日期为键的字典:

// apiAppointments为从API获取的原始预约数组
let apiAppointments: [Appointment] = [...]

// 按startTime字段分组
let groupedAppointments = Dictionary(grouping: apiAppointments) { $0.startTime }

3. 遍历日期数组生成目标结构

假设你已经有了当月所有日期的数组monthDates(格式为"yyyy-MM-dd"),遍历数组匹配分组数据:

// monthDates为包含当月所有日期的数组,例如["2022-09-01", "2022-09-02", ..., "2022-09-30"]
let monthDates: [String] = [...]

// 生成最终的分组数组
let appointmentsByDates = monthDates.map { date in
    // 匹配对应日期的预约,无预约则返回空数组
    let matchedAppointments = groupedAppointments[date] ?? []
    return AppointmentsByDate(title: date, appointments: matchedAppointments)
}

4. 可选:给单日期下的预约排序

如果需要对每个日期内的预约排序(比如按主题名称),可以在生成匹配数组时添加排序逻辑:

let matchedAppointments = groupedAppointments[date]?.sorted { $0.subject < $1.subject } ?? []

TableView适配使用

生成的appointmentsByDates可直接作为TableView数据源:

  • 节数:appointmentsByDates.count
  • 单节行数:appointmentsByDates[indexPath.section].appointments.count
  • 节标题:appointmentsByDates[indexPath.section].title

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:15:44