En general al empezar un proyecto si tienes la costumbre de crear un singleton para pasar de manera sencilla valores de un lado a otro, en su lugar deberías considerar la inyección de dependencias.
Una forma rápida de lograrlo es usar una librería que implemente ese patron, en nuestro caso usaremos Swinject
y para hacer las cosas más fáciles de inyectar y pedir al contenedor, haremos uso de el protocolos y una extensión al mismo para que se pueda inyectar desde un String
hasta una clase
, estructura
, valor de enumeración
, etc.
// tyoc213
import Swinject
enum InjectName:String {
case myValue
case serviceResponse
case anInt
}
extension Container {
func resolve<R>(from: InjectName) -> R {
let r:Inject<R> = resolve(InjectContainer.self, name: from.rawValue) as! Inject<R>
return r.value
}
func register<T>(from: InjectName, value:T){
register(InjectContainer.self, name: from.rawValue) {_ in Inject<T>(value: value)}
}
}
protocol InjectContainer {
}
struct Inject<T>:InjectContainer{
var value: T
init(value:T) {
self.value = value
}
}
Entonces, una vez creado el contenedor en el appDelegate se puede insertar y extraer datos de la siguiente forma
contenedor.register(.anInt, 1)
contenedor.register(serviceResponse, someInstance)
contenedor.register(.myValue, "some value")
Y para obtener esos datos
let a:Int = contenedor.resolve(.anInt)
let a:ResponseService = contenedor.resolve(.serviceResponse)
let a:String = contenedor.resolve(.myValue)
Se tiene que especificar el tipo de dato en la asignación ya que al ser un template
necesita resolver el tipo de dato al momento de compilar.
Top comments (0)