Home > front end >  How can I structure my data in swift IOS to use in tableView?
How can I structure my data in swift IOS to use in tableView?

Time:09-06

I have a Data which am getting from API, its in a format

    [ 
     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")
    ]

and I have an array where I have all the Dates of this month, what I want is I want the data to be spread across my month with respect to date in the month ex:

    [ 
       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-02",subject:"High Fever",activityid:"9274"),
          ]),
       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-06" , appointments: []),
       .
       .
       .
       AppointmentsByDates(title:"2022-09-30" , appointments: []),
    ]

If you see in the above example startTime is what the Data is segregate with,

I did this in React Native using Maps and Reduce in Javascript, am new to iOS i need this structured data to populate tableview with multiple sections of every Date in a month.

This image represents what I actually want in tableView

Can you help me out with it?

Thanks,

CodePudding user response:

Try this reduce method:

let sections = array.reduce(into: [AppointmentsByDates]()) { result, element in
    if let index = result.firstIndex(where: { resuty in
        return resuty.appointments.contains(where: {$0.startTime == element.startTime})
    }) {
        result[index].appointments.append(element)
    }else {
        result.append(AppointmentsByDates(title: element.startTime, appointments: [element]))
    }
}

CodePudding user response:

First of all, assume you have two struct which is Appointments and AppointmentsByDates

struct Appointments {
    var startTime : String
    var subject : String
    var activityid:  String
}

struct AppointmentsByDates {
    var title: String
    var appointments : [Appointments]
}

And you have your array just like above

let arr = [
    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")
]

And for your question, It can divide into two task: you can map your array into dictionary which key is startTime and the value is list of Appointments which map which that key ; The keys here are the title of AppointmentsByDates

// make dictionary which key is starttime
var dict : [String:[Appointments]] = [:]
for value in arr {
    dict[value.startTime, default: []].append(value)
}

// make result mapping the key of dictionary to title
var result : [AppointmentsByDates] = []
for key in dict.keys {
    let value = AppointmentsByDates(title: key, appointments: dict[key]!)
    result.append(value)
}

And then you will have your result

print("result: ", result) // get your result here
  • Related