Ich versuche, ein geeignetes Singleton-Modell für die Verwendung in Swift zu erarbeiten. Bisher konnte ich ein nicht threadsicheres Modell wie folgt zum Laufen bringen:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Das Umschließen der Singleton-Instanz in die statische Struktur sollte eine einzelne Instanz ermöglichen, die ohne komplexe Namensschemata nicht mit Singleton-Instanzen kollidiert, und die Dinge ziemlich privat machen. Offensichtlich ist dieses Modell jedoch nicht threadsicher. Also habe ich versucht dispatch_once
, das Ganze zu ergänzen :
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:
Der Ausdruckstyp 'Void' kann nicht in den Typ '()' konvertiert werden.
Ich habe verschiedene Varianten der Syntax ausprobiert, aber alle scheinen die gleichen Ergebnisse zu erzielen:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Was ist die richtige Verwendung von dispatch_once
Swift? Ich dachte anfangs, das Problem liege am Block aufgrund ()
der Fehlermeldung, aber je mehr ich es mir anschaue, desto mehr denke ich, dass es darum geht, die dispatch_once_t
richtige Definition zu erhalten.
@lazy
sollte jedoch jede Implementierung von thread-sicher sein.
Static.instance = TPScopeManager()
erzwingt den Instanztyp. Wenn Sie so etwas wie Static.instance = self()
einen erforderlichen Initialisierer verwenden, wird die entsprechende Typklasse generiert. Trotzdem, und das ist wichtig zu beachten, nur einmal für alle Instanzen in der Hierarchie! Der erste zu initialisierende Typ ist der für alle Instanzen festgelegte Typ. Ich glaube nicht, dass sich Objective-C gleich verhalten hat.