89 votes

Singleton avec propriétés en Swift 3

Dans le rapport d'Apple Utilisation de Swift avec le document Cocoa et Objective-C (mis à jour pour Swift 3), ils donnent l'exemple suivant du modèle Singleton :

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()

        // setup code

        return instance
    }()
}

Imaginons que ce singleton doive gérer un tableau variable de chaînes de caractères. Comment/où dois-je déclarer cette propriété et m'assurer qu'elle est initialisée correctement à un tableau vide de chaînes de caractères ? [String] le réseau ?

237voto

YannickSteph Points 7353

Pour moi, c'est le meilleur moyen, rendre l'intimité privée. Swift 3 \N 4 \N 5 syntaxe

// MARK: - Singleton

final class Singleton {

    // Can't init is singleton
    private init() { }

    // MARK: Shared Instance

    static let shared = Singleton()

    // MARK: Local Variable

    var emptyStringArray = [String]()

}

4 votes

J'ai upvoted cette réponse, mais pour correspondre à la syntaxe de Swift 3, "sharedInstance" devrait être changé en juste "shared".

0 votes

Il n'est pas nécessaire d'indiquer le type.

0 votes

@thibautnoah vous avez besoin, dans init ou directement

59voto

Vous pouvez initialiser un tableau vide comme ceci.

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton(array: [])
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]

    //MARK: Init

    init( array : [String]) {
        emptyStringArray = array
    }
}

Ou si vous préférez une approche différente, celle-ci fera l'affaire.

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton()
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]? = nil

    //MARK: Init

    convenience init() {
        self.init(array : [])
    }

    //MARK: Init Array

    init( array : [String]) {
        emptyStringArray = array
    }
}

30voto

Mehul Sojitra Points 979

Selon la documentation de la pomme : En Swift, vous pouvez simplement utiliser une propriété de type statique, qui est garantie d'être initialisée paresseusement une seule fois, même en cas d'accès simultané à plusieurs threads. .

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()
}

Avec méthode d'initialisation :

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}

3 votes

Pourquoi le init() n'est pas privé ?

0voto

gnasher729 Points 5011

Toute initialisation serait effectuée dans une méthode init. Aucune différence ici entre un singleton et un non-singleton.

26 votes

Un extrait de code supplémentaire qui répond directement à la question rendrait cette réponse plus utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X