Singleton avec des propriétés Swift 3
D'Apple dans la L'utilisation de Swift avec Cocoa et Objective-C document (mis à jour pour Swift 3) ils donnent l'exemple suivant le pattern Singleton:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
//setup code
return instance
}()
}
Imaginons que ce singleton doit gérer une variable tableau de Chaînes de caractères. Comment/où puis-je déclarer que de la propriété et de s'assurer qu'il est initialisé correctement à un vide [String]
tableau?
Vous devez vous connecter pour publier un commentaire.
Pour moi c'est le meilleur moyen, faire init privé. Swift 3 \ 4 \ 5 syntaxe
static let shared = Singleton()
static let shared: Singleton = Singleton()
au lieu de cela, vous pouvez simplement écrirestatic let shared = Singleton()
override
devrait être appliquée àinit
méthode.override private init() {}
au lieu de simplementprivate init() { }
final class Singleton: NSObject { private override init() { } }
class Singleton { ... } / class MockSingleton: Singleton { ... }
object
au lieu declass
, c'est tout ce dont vous avez besoin pour Singleton, rien de plus)Vous pouvez initialiser un tableau vide comme ça.
Ou si vous préférez une approche différente, ce sera parfait.
extension Cache { static let sharedInstance: Cache = { let instance = Cache() return instance }() }
class var
dans iOS 10 pour les singletons (par exemple UIApplication). Leur mise en œuvre sera le même que celui de la?private
méthodes même pasinternal
. Cela empêche d'autres personnes d'utiliser la valeur par défaut '()' initialisation pour cette classe.private
dansinit
.emptyStringArray
thread-safe, mais d'un autre côté types de valeur dans swift sont thread-safe, doncemptyStringArray
est tableau, les tableaux est le type de la valeur, il est peut-être thread-safe.Que par la pomme de documentation: En Swift, vous pouvez simplement utiliser un type statique de la propriété, qui est garanti pour être initialisées qu'une seule fois, même lorsque l'on y accède à travers plusieurs threads simultanément.
Avec la méthode d'initialisation:
Toute initialisation serait fait dans une méthode init. Pas de différence ici entre un singleton et un non-singleton.