web-dev-qa-db-fra.com

Comment créer un objet singleton en rapide

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?

17
user4790024

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

9
wilforeal

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
    }
}
23
Vatsal Manot

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] = []

}
3
YannickSteph

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é.

1
onmyway133