В Swift шаблон Singleton позволяет создать глобальный объект, доступный во всем вашем приложении. Этот объект создается только один раз, гарантируя, что в любой момент времени существует только один его экземпляр. В этой статье мы рассмотрим различные методы создания объекта Singleton статического типа в Swift, используя разговорный язык и примеры кода.
Метод 1: классический синглтон
class MySingleton {
static let shared = MySingleton()
private init() {}
}
Объяснение: Эта классическая реализация гарантирует, что будет создан только один экземпляр MySingleton, доступ к которому можно получить через свойство shared. Закрытый инициализатор не позволяет внешнему коду создавать дополнительные экземпляры.
Метод 2. Использование статического свойства
class MySingleton {
static let shared = MySingleton()
static func getInstance() -> MySingleton {
return shared
}
private init() {}
}
Объяснение: В этом подходе мы определяем статический метод getInstance(), который возвращает общий экземпляр MySingleton. Этот метод можно вызвать для получения объекта Singleton.
Метод 3: ленивая инициализация с помощью send_once (до Swift 3)
class MySingleton {
static let shared = MySingleton()
private init() {}
class func getInstance() -> MySingleton {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: MySingleton? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = MySingleton()
}
return Static.instance!
}
}
Объяснение: Этот метод использует функцию dispatch_once, чтобы гарантировать, что синглтон создается только один раз. Переменная onceTokenи переменная instanceиспользуются для отслеживания состояния инициализации.
Метод 4: использование оберток свойств (Swift 5.1+)
@propertyWrapper
struct Singleton<T> {
private var value: T?
var wrappedValue: T {
mutating get {
if value == nil {
value = T()
}
return value!
}
}
}
class MySingleton {
@Singleton var shared = MySingleton()
private init() {}
}
Объяснение: в этом подходе используется оболочка свойства Singleton. Свойство wrappedValueинициализируется лениво и гарантирует, что объект Singleton будет создан только один раз.
В этой статье мы рассмотрели несколько методов создания объекта Singleton статического типа в Swift. Мы рассмотрели классический шаблон Singleton с использованием статических свойств и методов, ленивой инициализации с помощью dispatch_once(до Swift 3) и современный подход с использованием оберток свойств. В зависимости от требований вашего проекта и версии Swift вы можете выбрать метод, который лучше всего соответствует вашим потребностям.
Реализуя шаблон Singleton, вы можете гарантировать, что в вашем приложении будет только один экземпляр вашего объекта, обеспечивая удобный и централизованный способ доступа к общим ресурсам.