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