Search code examples
arraysswiftfor-loopuisegmentedcontrol

Index out of range convert date to string component


I know this is a trivial error, but I can't figure it out and I am stuck.
I want to assign to a UISegmentedControl (having 6 segments) the current date in the first segment and the following 5 days dates in the next segments as in the picture below. To do this, I need to construct an array of string from date, but I get index out of range on this line let dayString = dateFormatter.shortWeekdaySymbols[dayComponent-1]

var stringDates = [String]()
override func viewDidLoad() {
    super.viewDidLoad()


//for each segment, construct a string date with the currentDate() being first
    for i in 1...6 {

        let dateFormatter = DateFormatter()

        let today = Date()
        let calendar = Calendar.current

        if i == 1 {
           let dayComponent = Calendar.current.component(.day,from: today)
             let dayString = dateFormatter.shortWeekdaySymbols[dayComponent-1]  
               let month = Calendar.current.component(.month, from: today)
                let monthSymbol = dateFormatter.shortMonthSymbols[month-1]

                   let dayMonthString = dayString + monthSymbol
                         stringDates.append(dayMonthString)
        } else {
           var components = DateComponents()
           components.weekday = i
            let nextDay = calendar.date(byAdding: components, to: today)
              let dayComponent = Calendar.current.component(.day,from: nextDay!)
                let dayString = dateFormatter.shortWeekdaySymbols[dayComponent-1]

            let month = Calendar.current.component(.month, from: nextDay!)
              let monthSymbol = dateFormatter.shortMonthSymbols[month-1]
               let dayMonthString = dayString + monthSymbol
                  stringDates.append(dayMonthString)
         }          
    }
  }

enter image description here


Solution

  • Instead of .day in let dayComponent = Calendar.current.component(.day,from: today) use .weekday as shown below:

    let today = Date()
    let dateFormatter = DateFormatter()
    let dayComponent = Calendar.current.component(.weekday,from: today)
    let dayString = dateFormatter.shortWeekdaySymbols[dayComponent - 1]  //Fri