DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’» is a community of 963,503 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
tyoc213
tyoc213

Posted on

Swinject, protocolos y tipos de datos

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)

🌚 Browsing with dark mode makes you a better developer.

It's a scientific fact.