web-dev-qa-db-fra.com

Singleton avec propriétés dans Swift 3

Dans le en utilisant Swift avec les documents Cocoa et Objective-C de Apple (mis à jour pour Swift 3), on donne l'exemple suivant du modèle Singleton:

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

        // setup code

        return instance
    }()
}

Imaginons que ce singleton ait besoin de gérer un tableau variable de chaînes. Comment/où devrais-je déclarer cette propriété et m'assurer qu'elle est correctement initialisée dans un tableau vide [String]?

86
RobertJoseph

Pour moi, c’est le meilleur moyen de rendre init privée. syntaxe Swift 3\4\5

// 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]()

}
234
YannSteph

Vous pouvez initialiser un tableau vide comme celui-ci.

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
    }
}
58
user6375148

Selon la documentation de Apple: Dans Swift, vous pouvez simplement utiliser une propriété de type statique, qui est garantie de ne pouvoir être initialisé qu'une fois paresseux, 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() {
    }

}
31
Mehul Sojitra

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

1
gnasher729