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
相关产品推荐
相关产品推荐

