J'apprends le motif Singleton de manière rapide et efficace pour créer une classe Singleton et j'ai découvert le meilleur moyen de créer comme ci-dessous.
class SingletonClass{
static let sharedInstance = SingletonClass()
}
Depuis que j'ai utilisé l'instruction let
, il s'agit d'une propriété en lecture seule et doit être thread-safe, il n'est donc pas nécessaire de dispatch_once () à partir de Objective C.And static
est utilisé pour créer la variable sharedInstance
en tant que variable class
.
Mais comment cette garantie existe-t-elle qu'une seule instance soit créée dans l'application? Y a-t-il une petite chose qui me manque?
Le mot-clé static est garanti. vous pouvez référencer cet article: https://thatthinginswift.com/singletons/
J'espère que cela pourra aider.
Le mot-clé static indique qu'une variable membre, ou une méthode, peut être accédé sans nécessiter une instanciation de la classe à laquelle il fait parti. En termes simples, cela signifie que vous pouvez appeler une méthode, même si vous n'avez jamais créé l'objet auquel il appartient
Si vous voulez empêcher / l'instanciation de votre classe (restreindre effectivement l'utilisation au singleton), vous marquez votre initialiseur comme étant private
:
class SingletonClass {
static let shared = SingletonClass()
private init() {
// initializer code here
}
}
Faites un init privé, par exemple:
final class Singleton {
// Can't init is singleton
private init() { }
//MARK: Shared Instance
static let sharedInstance: Singleton = Singleton()
//MARK: Local Variable
var emptyStringArray : [String] = []
}
Tu as raison. Et vous voudrez peut-être lire Fichiers et initialisation sur la gestion des variables globales et statiques dans Swift
Swift utiliser cette approche
Initialisez paresseusement, lancez l'initialiseur pour un global la première fois est référencé, similaire à Java.
Ça dit
il permet des initialiseurs personnalisés, le temps de démarrage dans Swift évolue proprement sans initialiseurs globaux pour le ralentir, et l'ordre de l'exécution est complètement prévisible.
L'initialiseur différé pour une variable globale (également pour les membres statiques de Structs et enums) est exécuté lors du premier accès à global, et est lancé en tant que
dispatch_once
pour vous assurer que l'initialisation est bien atomique. Cela permet une méthode intéressante pour utiliser dispatch_once dans votre code: il suffit de déclarer une variable globale avec un initialiseur et de la marquer privé.