Ich versuche, ein geeignetes Singleton-Modell für die Verwendung in Swift herauszufinden. Bisher konnte ich ein nicht threadsicheres Modell zum Laufen bringen, wie folgt:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Das Einwickeln der Singleton-Instanz in der Static-Struktur sollte eine einzelne Instanz ermöglichen, die nicht mit anderen Singleton-Instanzen kollidiert, ohne komplizierte Namenskonventionen anwenden zu müssen, und es sollte die Dinge ziemlich privat halten. Offensichtlich ist dieses Modell jedoch nicht threadsicher. Also habe ich versucht, dispatch_once
zum Ganzen hinzuzufügen:
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!
}
}
Aber ich bekomme einen Compilerfehler in der dispatch_once
-Zeile:
Kann den Typ des Ausdrucks 'Void' nicht in den Typ '()' konvertieren
Ich habe schon einige verschiedene Varianten der Syntax ausprobiert, aber sie scheinen alle die gleichen Ergebnisse zu haben:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Was ist die richtige Verwendung von dispatch_once
mit Swift? Ich dachte zunächst, das Problem sei mit dem Block aufgrund der ()
in der Fehlermeldung, aber je mehr ich darüber nachdenke, desto mehr glaube ich, dass es darauf ankommt, den dispatch_once_t
richtig zu definieren.