Расширение Date для быстрого увеличения даты

datecomponents
extentions
ios

#1
extension Date {

  func adding(minutes: Int) -> Date {
    return Calendar.current.date(byAdding: .minute, value: minutes, to: self)!
  }
  
  func adding(hours: Int) -> Date {
    return Calendar.current.date(byAdding: .hour, value: hours, to: self)!
  }
  
  func adding(days: Int) -> Date {
    return Calendar.current.date(byAdding: .day, value: days, to: self)!
  }
  
  func adding(weaks: Int) -> Date {
    return Calendar.current.date(byAdding: .day, value: weaks * 7, to: self)!
  }
  
  func adding(months: Int) -> Date {
    return Calendar.current.date(byAdding: .month, value: months, to: self)!
  }
  
  func adding(years: Int) -> Date {
    return Calendar.current.date(byAdding: .year, value: years, to: self)!
  }

}

Использовать так:

let newDate = oldDate.adding(days: 5)


#2

Я бы сделал один метод для этого всего, но с пометкой для недель

    /// To increment date by weeks, first parameter should be nil.
    func adding(component: Calendar.Component? = nil, by value: Int) -> Date {
            var _type: Calendar.Component = .day
            var _value: Int = value
            
            if let t = component {
                _type = t
                _value *= 7
            }
            
            return Calendar.current.date(byAdding: _type, value: _value, to: self)!
        }

Т.к. нету значения .week, пришлось сделать костыль в виде nil для компонента.

И использовать так:
let newDate = oldDate.adding(component: .day, by: 3) // Add 3 days
let newDate = oldDate.adding(component: .month, by: 1) // Add 1 month
let newDate = oldDate.adding(by: 2) // Add 2 weeks


#3

Да, неделю он не умеет считать. По способу реализации, кому как удобней


#4

Как по мне, вывод подсказок как на скрине, более понятен и лаконичен:


#5

Опять же, дело вкуса.


#6

Вот и я о том же. Пусть здесь останутся оба варианта. Может кому и пригодится в будущем