veloz 3 cómo get la date para mañana y ayer (tenga cuidado caso especial) nuevo mes o año nuevo

Trabajo en el calendar de datos para cada mes actual y debería mostrar 3 tipo de cálculo para (ayer – hoy – mañana)

he fallado debido a (índice fuera de límite) para un caso especial como si fuera la date de hoy (31 de mayo de 2017) y tengo una matriz de mes de mayo si bash continuar con mi aplicación y comenzar a calcular mañana, tendré un error [porque debería saber su nuevo mes mañana]

este es mi codigo

class ViewController: UIViewController { var dateComponents: DateComponents! var TimeToday :[String] = [] var TimeTomorrow :[String] = [] var TimeYesterday :[String] = [] override func viewDidLoad() { super.viewDidLoad() let dateDay = Date() let calendar = Calendar(identifier: .gregorian) dateComponents = calendar.dateComponents([.day, .month, .year], from: dateDay) done() } func done() { //------ for tomorrow ------ // month end day 31 if (dateComponents.day! == 30){ if(dateComponents.month! == 1 || dateComponents.month! == 4 || dateComponents.month! == 6 || dateComponents.month! == 7 || dateComponents.month! == 9 || dateComponents.month! == 11 ){ TimeTomorrow.append("\(dateComponents.month!+1)") } // month end day 31 }else if (dateComponents.day! == 31){ if(dateComponents.month! == 3 || dateComponents.month! == 5 || dateComponents.month! == 8 ){ TimeTomorrow.append("\(dateComponents.month!+1)") }else if(dateComponents.month! == 12){ TimeTomorrow.append("\(dateComponents.year!+1)") } // month end day 29 // special case for leap year i donot know how find it //**************************************************** else if (dateComponents.day! == 29){ if(dateComponents.month! == 2 || dateComponents.month! == 10 ){ TimeTomorrow.append("\(dateComponents.month!+1)") } } //------ for yesterday ------ if (dateComponents.month! == 12 || dateComponents.month! == 10 || dateComponents.month! == 8 || dateComponents.month! == 7 || dateComponents.month! == 5 || dateComponents.month! == 2){ var day = dateComponents.date! - 1 //fatal error: unexpectedly found nil while unwrapping an Optional value TimeYesterday.append("\(day)") TimeYesterday.append("30 - \(dateComponents.month! - 1)") }else { ////// } } } } 

Debería usar la date(byAdding component:) método Calendario date(byAdding component:) para hacer sus cálculos calendáricos y, por lo tanto, no necesita preocuparse por esos casos especiales:

 extension Date { var yesterday: Date { return Calendar.current.date(byAdding: .day, value: -1, to: self)! } var tomorrow: Date { return Calendar.current.date(byAdding: .day, value: 1, to: self)! } var noon: Date { return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)! } var month: Int { return Calendar.current.component(.month, from: self) } var isLastDayOfMonth: Bool { return tomorrow.month != month } } 

 Date().yesterday // "May 15, 2017, 4:27 PM" Date() // "May 16, 2017, 4:27 PM" Date().tomorrow // "May 17, 2017, 4:27 PM" Date().tomorrow.noon // "May 17, 2017, 12:00 PM" Date().yesterday.month // 5 Date().isLastDayOfMonth // false 

No sé si esto te ayuda o no, pero recomendaría no hacer las matemáticas en NSDateComponents sino más bien en NSDate. Echa un vistazo a https://github.com/malcommac/SwiftDate un cocoapod para saber cómo hacer cosas como llamar tomorrow en un NSDate. Lo bueno de ese pod es que usa Regions que ayudan a la internationalization, donde al día siguiente podría comenzar al atardecer en lugar de a mediados de la noche.