#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"