ios - create - Cómo crear objetos Singleton en swift
singleton swift 4 (4)
Estoy aprendiendo sobre el patrón de Singleton de forma rápida y eficiente para crear una clase de Singleton y descubrí la mejor manera de crear como se muestra a continuación.
class SingletonClass{
static let sharedInstance = SingletonClass()
}
Ya que uso la instrucción let
, es de solo lectura y debe ser seguro para subprocesos, por lo que no hay necesidad de dispatch_once () desde Objective C. Y static
se usa para hacer que la variable sharedInstance
sea una variable de class
, supongo.
Pero, ¿cómo garantiza esto que solo se crea una instancia a lo largo de la aplicación? ¿Hay algo que me esté perdiendo?
Hacer inicio privado, por ejemplo:
final class Singleton {
// Can''t init is singleton
private init() { }
//MARK: Shared Instance
static let sharedInstance: Singleton = Singleton()
//MARK: Local Variable
var emptyStringArray : [String] = []
}
Lo que garantiza que solo se crea una vez es la palabra clave static . puede consultar este artículo: https://thatthinginswift.com/singletons/
Espero que ayude.
La palabra clave estática denota que se puede acceder a una variable o método miembro sin requerir una instanciación de la clase a la que pertenece. En términos simples, significa que puede llamar a un método, incluso si nunca ha creado el objeto al que pertenece
Si desea evitar la creación de instancias de su clase (restringiendo efectivamente el uso a solo el singleton), entonces marque su inicializador como private
:
class SingletonClass {
static let shared = SingletonClass()
private init() {
// initializer code here
}
}
Tienes razón. Y es posible que desee leer Archivos e Inicialización acerca de cómo se manejan las variables globales y estáticas en Swift
Rápido usar este enfoque
Inicialice perezosamente, ejecute el inicializador para un global la primera vez que se haga referencia, similar a Java.
Dice
permite inicializadores personalizados, tiempo de inicio en Swift escala limpiamente sin inicializadores globales para frenarlo, y el orden de ejecución es completamente predecible.
El inicializador perezoso para una variable global (también para miembros estáticos de estructuras y enumeraciones) se ejecuta la primera vez que se accede a global, y se inicia como
dispatch_once
para asegurarse de que la inicialización sea atómica. Esto permite una manera fresca de usar dispatch_once en su código: simplemente declare una variable global con un inicializador y márquela como privada.