Как мне создать глобальную дату, к которой можно получить доступ и изменить с помощью любого контроллера представления в swift?

#swift #class #date #model #static

#swift #класс #Дата #Модель #статический

Вопрос:

Вот код, который я придумал:

 import Foundation

class MonthToAdjust {
    
    static var date = Date()
    
    init(date: Date) {
        MonthToAdjust.self.date = date
    }
    
    static func increaseDateByAMonth() {
        MonthToAdjust.date = Calendar.current.date(byAdding: .month, value: 1, to: MonthToAdjust.date)!
    }
    static func decreaseDateByAMonth() {
        MonthToAdjust.date = Calendar.current.date(byAdding: .month, value: -1, to: MonthToAdjust.date)!
    }
    
}
  

У него есть статическая переменная для даты.

Есть 2 статические функции, которые либо увеличивают, либо уменьшают дату на месяц.

Это правильно? Есть ли лучший способ?

Комментарии:

1. Похоже, вы пытаетесь создать синглтон — вы можете увидеть, что такое синглтон?

2. Какова цель здесь и как / когда будет вызван init?

Ответ №1:

Ваш подход в порядке. Второстепенный момент: вам не нужно создавать новую дату () в методе init(), если вы создаете ее при инициализации переменной.

Другим подходом было бы использовать общий одноэлементный объект — здесь статичным является сам объект, в то время как члены являются обычными переменными экземпляра, например

 import Foundation

class MonthToAdjust {
    
    static var shared = MonthToAdjust()

    var date
    
    init(_ date: Date = Date()) {
        self.date = date
    }
    
    func increaseDateByAMonth() {
        self.date = Calendar.current.date(byAdding: .month, value: 1, to: self.date)!
    }
    func decreaseDateByAMonth() {
        self.date = Calendar.current.date(byAdding: .month, value: -1, to: self.date)!
    }
}
  

Затем вы можете сделать это в своем коде:

 MonthToAdjust.shared.date = Date() // reset to now, or set to another date similarly
MonthToAdjust.shared.increaseByAMonth()
MonthToAdjust.shared.decreaseByAMonth()
let dateCopy = MonthToAdjust.shared.date // do something with current value
  

Ответ №2:

Как уже предлагалось в комментарии, вы можете создать одноэлементный класс. Просто убедитесь, что вы объявили инициализатор как закрытый, чтобы избежать создания нескольких экземпляров одноэлементного класса:

 class Singleton {
    static var shared = Singleton()
    var date = Date()
    private init() { }
}
  

Если вы хотите добавить месяц к определенной дате, вы можете расширить дату и создать метод изменения, чтобы добавить значения компонентов к вашей дате:

 extension Date {
    mutating func add(_ component: Calendar.Component, value: Int) {
        self = Calendar.current.date(byAdding: component, value: value, to: self)!
    }
}
  

Обратите внимание, что значение свойства date будет инициализировано при первом обращении к общему свойству:


 print(Singleton.shared.date)  // "2020-09-16 20:22:04  0000n"
Singleton.shared.date.add(.month, value: 1)
print(Singleton.shared.date)  // "2020-10-16 20:22:04  0000n"