Шаблон Swift Singleton: создание отдельного глобального объекта

В 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, вы можете гарантировать, что в вашем приложении будет только один экземпляр вашего объекта, обеспечивая удобный и централизованный способ доступа к общим ресурсам.