Использование Swift-синглтона

У меня есть следующий класс Singleton:

class Singleton {
    static let sharedInstance = Singleton()
}

Я могу найти очень мало в Интернете о том, как использовать многочисленные быстрые реализации шаблона Singleton. Я использовал его раньше в Objective-C в предыдущем приложении, но мне он показался гораздо более простым.

Например, если бы я хотел создать массив пользовательских объектов, которые можно было бы использовать в любом месте приложения, как бы я его объявил и как бы реализовал. В моем классе Objective-C Singleton я создаю глобальные переменные в файле класса, а затем реализую его следующим образом:

singletonClass *mySingleton = [singletonClass sharedsingletonClass];
mySingleton.whatever = "blaaaah"

Я ценю помощь! Также я новичок здесь и новичок в Swift.


person Alex Cauthen    schedule 18.01.2016    source источник


Ответы (2)


В Swift есть много информации о синглтонах. Вы наткнулись на эту статью со своим мастерством Google? http://krakendev.io/blog/the-right-way-to-write-a-singleton

Но чтобы ответить на ваш вопрос, вы можете просто определить все, что вы хотели бы использовать в обычном режиме.

class Singleton {
    static let sharedInstance = Singleton() // this makes singletons easy in Swift
    var stringArray = [String]()

}

let sharedSingleton = Singleton.sharedInstance

sharedSingleton.stringArray.append("blaaaah") // ["blaaaah"]

let anotherReferenceToSharedSingleton = Singleton.sharedInstance

print(anotherReferenceToSharedSingleton.stringArray) // "["blaaaah"]\n"
person Andrew Sowers    schedule 18.01.2016
comment
Собственно, отсюда я и взял свой код, однако статья представляет собой скорее анализ каждого метода, чем объяснение того, что происходит. Цените помощь. - person Alex Cauthen; 19.01.2016
comment
Не проблема! В этом случае вам может быть полезен этот пост: github.com/hpique/SwiftSingleton. - person Andrew Sowers; 19.01.2016

Согласен с Эндрю Соуэрсом. Просто помните, что вы также должны объявить частный инициализатор следующим образом:

class Singleton: NSObject {
    static let sharedInstance = Singleton()
    private override init() {}
}

Без этого частного init() другие объекты могли бы создать свой собственный экземпляр:

let mySingleton = Singleton()

Теперь есть два экземпляра: Singleton.sharedInstance и mySingleton — больше не синглтон! Я обнаружил это через неприятную ошибку, когда несколько «одиночек» запускали таймеры и сеяли хаос.

person Jeff Sorrentino    schedule 02.03.2019