2014-11-12 2 views
4

Я создаю класс одноплодной в Swift следующим образом:iOS8 + Swift: Создать истинный класс одноплодной

class SingletonClass { 

    class var sharedInstance: SingletonClass { 
     struct Singleton { 
      static let instance = SingletonClass() 
     } 

     return Singleton.instance 
    } 


    var a: Int? 
    var b: Int? 
    var c: Int? 
} 

Это позволяет мне получить доступ к общему экземпляру из любого места:

SingletonClass.sharedInstance 

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

let DifferentInstance: SingletonClass = SingletonClass() 

И общий экземпляр не только один больше.

Итак, мой вопрос заключается в следующем: есть ли способ в Swift создать настоящий одноэлементный класс, где возможен только один экземпляр?

+0

Почему вы хотите обеспечить, чтобы никто не мог создать экземпляр класса? –

+1

@ DanielGalasko, скажем, например, если у вас есть физический ресурс, с которым ваш класс управляет взаимодействием. Возможно, что несколько экземпляров, взаимодействующих с одним и тем же ресурсом, могут вызвать серьезные или фатальные проблемы. Или, возможно, это просто взаимодействие с базой данных, которая не может быть открыта более одного раза за раз. – drewag

+0

Я слышу вас, но, к сожалению, нет средств защиты вашей каркас от чужого невежества или глупости. Ваш лучший вариант - определить большинство методов установки объектов внутри экземпляра синглтонов, например, URL-адреса базы данных и т. Д. ... –

ответ

14

Просто объявить инициализатору как частные:

private init() {} 

Теперь новые экземпляры могут быть созданы только из одного файла.

0

Глобальные переменные, Вложенная структура, dispatch_once. Выбери один.

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

private let _singletonInstance = SingletonClass() 
class SingletonClass { 
    class var sharedInstance: SingletonClass { 
    return _singletonInstance 
    } 
} 

Подробнее здесь. https://github.com/hpique/SwiftSingleton

2

Вы неправильно поняли природу синглтона. Цель singleton - обеспечить синглтон, а не предотвращать зло. I может сделать другое UIApplication вместо sharedApplication, но это было бы глупо, поскольку это не было бы sharedApplication. I может сделать другой NSNotificationCenter вместо defaultCenter, но это было бы глупо, поскольку это не было бы defaultCenter. Дело не в том, чтобы не остановить меня от глупости, а предоставить фабричный синглтон, и это то, что вы уже делаете. Не волнуйся, будь счастлив.

+0

Я как раз собирался прокомментировать одно и то же. Почти невозможно предотвратить «глупость» (из-за отсутствия лучшего слова).Если люди хотят выделить новые экземпляры, то пусть они просто документируют, что это не способ сделать это, и что указанное поведение не определено –

+1

Да, ну, я немного разорван между «глупым» и «злым», который почему я использовал оба. :) Программирование ООП - это _contract_. Любой может разорвать контракт (например, вы всегда можете избежать ограничений конфиденциальности, если вы действительно этого хотите). Идея, однако, не в этом. – matt

+3

Однако одним из основных понятий в юзабилити является идея льгот. Уменьшение того, что возможно, делает что-то более простым в использовании. Особенно, когда решение так же просто, как сделать инициализатор приватным (см. Мой ответ), я думаю, что это лучше сделать. Кроме того, первая строка в wikipedia для singleton - «В разработке программного обеспечения шаблон singleton представляет собой шаблон проектирования, который ограничивает создание экземпляра класса одним объектом». Существует различие между общим экземпляром и синглом. – drewag

Смежные вопросы