Как создать объект Singleton в swift

Я изучаю шаблон Singleton быстрым и эффективным способом создания класса Singleton и нашел лучший способ создать, как показано ниже.

class SingletonClass{
    static let sharedInstance = SingletonClass()
}

Так как я использую оператор let, это свойство только для чтения и должно быть потокобезопасным, поэтому нет необходимости в dispatch_once() с Objective C.And static используется для создания переменной sharedInstance как полагаю class.

Но как это гарантирует, что в приложении есть только один экземпляр? Есть ли небольшая вещь, которую я не вижу?

Ответы

Ответ 1

Какими гарантиями он создается только один раз - это ключевое слово static. вы можете ссылаться на эту статью: https://thatthinginswift.com/singletons/

Надеюсь, что это поможет.

Ключевое слово static означает, что переменная-член или метод могут быть доступ, не требующий создания класса, к которому он принадлежит. Говоря простыми словами, это означает, что вы можете вызвать метод, даже если вы никогда не создавали объект, к которому он принадлежит

Ответ 2

Если вы хотите предотвратить создание экземпляра своего класса (фактически ограничивая использование только одним синглтоном), вы отмечаете свой инициализатор как private:

private init()
{
    // initializer code here
}

Ответ 3

Сделайте частный init, например:

final class Singleton {

    // Can't init is singleton
    private init() { }

    //MARK: Shared Instance

    static let sharedInstance: Singleton = Singleton()

    //MARK: Local Variable

    var emptyStringArray : [String] = []

}

Ответ 4

Ты прав. И вы можете прочитать Files and Initialization о том, как обрабатывать глобальную и статическую переменные в Swift

Быстро использовать этот подход

Инициализируйте лениво, запустите инициализатор для глобальной в первый раз ссылается, подобно Java.

В нем говорится

он позволяет настраивать инициализаторы, время запуска в Swift масштабируется чисто без глобальных инициализаторов, чтобы замедлить его, и порядок выполнение полностью предсказуемо.

ленивый инициализатор для глобальной переменной (также для статических членов structs и enums) запускается в первый раз, когда глобальный доступ доступен, и запускается как dispatch_once, чтобы убедиться, что инициализация атомное. Это позволяет использовать класс dispatch_once в вашем коде: просто объявите глобальную переменную с инициализатором и отметьте ее частный.