Je suis en train de mettre au point un singleton modèle pour l'utilisation de Swift. Jusqu'à présent, j'ai été en mesure d'obtenir un non-thread-safe modèle de travail en tant que:
class var sharedInstance:TPScopeManager {
get {
struct Static {
static var instance : TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Habillage de l'instance du singleton dans la Statique de la structure doit permettre à une instance unique qui n'entrent pas en collision avec singleton instances sans complexe de nommage schemings, et devrait rendre les choses assez privé. De toute évidence cependant, ce modèle n'est pas thread-safe, donc j'ai essayé d'ajouter dispatch_once à l'ensemble de la chose:
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!
}
}
Mais j'obtiens une erreur du compilateur sur la dispatch_once ligne:
Cannot convert the expression's type 'Void' to type '()'
J'ai essayé plusieurs différentes variantes de la syntaxe, mais ils semblent tous avoir les mêmes résultats:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Quelqu'un sait ce que le bon usage de l' dispatch_once
est l'utilisation de swift? J'ai d'abord pensé que le problème était avec le bloc en raison de l' ()
dans le message d'erreur, mais plus je la regarde et plus je pense que c'est peut être une question de l' dispatch_once_t
correctement défini.