example - Singleton con propiedades en Swift 3
singleton swift 4 (4)
Cualquier inicialización se haría en un método init. No hay diferencia aquí entre un singleton y un no singleton.
En el documento Uso de Swift de Apple con Cocoa y Objective-C (actualizado para Swift 3) dan el siguiente ejemplo del patrón Singleton:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
Imaginemos que este singleton necesita administrar una matriz variable de cadenas.
¿Cómo / dónde declararía esa propiedad y me aseguraría de que se inicialice correctamente en una matriz
[String]
vacía?
Para mí esta es la mejor manera, hacer que init sea privado. Sintaxis 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]()
}
Puede inicializar una matriz vacía como esta.
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
}
}
O si prefiere un enfoque diferente, este funcionará bien.
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
}
}
Según la documentación de la manzana: en Swift, simplemente puede usar una propiedad de tipo estático, que se garantiza que se inicializará perezosamente solo una vez, incluso cuando se accede a través de varios subprocesos simultáneamente .
class Singleton {
// MARK: - Shared
static let shared = Singleton()
}
Con método de inicialización:
class Singleton {
// MARK: - Shared
static let shared = Singleton()
// MARK: - Initializer
private init() {
}
}