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]
?
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]()
}
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
}
}
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() {
}
}
Toute initialisation serait faite dans une méthode init. Aucune différence ici entre un singleton et un non-singleton.