Я пытаюсь разработать подходящую модель синглтона для использования в Swift. До сих пор я смог получить не поточную модель, работающую как:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Обтекание одноэлементного экземпляра в структуре Static должно позволять одному экземпляру, который не сталкивается с одноэлементными экземплярами, без сложных схем именования, и это должно делать вещи довольно частными. Очевидно, что эта модель не является поточно-ориентированной. Поэтому я попытался добавить dispatch_once
ко всему этому:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
static var token: dispatch_once_t = 0
}
dispatch_once(Static.token) { Static.instance = TPScopeManager() }
return Static.instance!
}
}
Но я получаю сообщение об ошибке компилятора dispatch_once
:
Невозможно преобразовать тип выражения 'Void' в тип '()'
Я пробовал несколько разных вариантов синтаксиса, но все они, похоже, имеют одинаковые результаты:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Как правильно использовать dispatch_once
Swift? Сначала я думал, что проблема с блоком из- ()
за сообщения об ошибке, но чем больше я на него смотрю, тем больше думаю, что это может быть вопросом dispatch_once_t
правильного определения.
@lazy
должна быть поточно-ориентированной.
Static.instance = TPScopeManager()
заставляет тип экземпляра. Если вы используете что-то вроде Static.instance = self()
обязательного инициализатора, будет создан соответствующий класс типов. Тем не менее, и это важно отметить, только один раз для всех случаев в иерархии! Первый тип для инициализации - это тип, установленный для всех экземпляров. Я не думаю, что цель-c вела себя так же.