Estoy tratando de encontrar un modelo singleton apropiado para usar en Swift. Hasta ahora, he podido obtener un modelo seguro sin subprocesos que funciona como:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Ajustar la instancia singleton en la estructura Estática debería permitir una instancia única que no colisione con instancias singleton sin esquemas de nombres complejos, y debería hacer que las cosas sean bastante privadas. Obviamente, este modelo no es seguro para subprocesos. Así que traté de agregar dispatch_once
a todo el asunto:
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!
}
}
Pero me sale un error del compilador en la dispatch_once
línea:
No se puede convertir el tipo de expresión 'Void' a tipo '()'
He probado varias variantes diferentes de la sintaxis, pero todas parecen tener los mismos resultados:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
¿Cuál es el uso adecuado del uso de dispatch_once
Swift? Inicialmente pensé que el problema estaba en el bloque debido al ()
mensaje de error, pero cuanto más lo miro, más creo que puede ser una cuestión de dispatch_once_t
definirlo correctamente.
@lazy
debe ser segura para subprocesos.
Static.instance = TPScopeManager()
fuerza el tipo de instancia. Si usa algo como Static.instance = self()
con un inicializador requerido, se generará la clase de tipo apropiada. Aun así, y esto es lo importante a tener en cuenta, ¡solo una vez para todas las instancias en la jerarquía! El primer tipo que se inicializa es el conjunto de tipos para todas las instancias. No creo que el objetivo-c se haya comportado igual.