Usando Swinject para inyectar una instancia de la class Model en una instancia de la class View en Swift

En un Swift 2.0, proyecto de aplicación de una sola página, en XCode 7.0.1, con el marco de inyección Swift de Swift, estoy haciendo lo siguiente:

DuplicateProtocol.swift:

protocol DuplicateProtocol { var id: String { get } } 

SingletonProtocol.swift:

 protocol SingletonProtocol { var id: String { get } } 

DuplicateProxy.swift

 class DuplicateProxy: DuplicateProtocol { let id: String init ( id: String ) { self.id = "DuplicateProxy." + id } } 

SingletonProxy.swift:

 class SingletonProxy: SingletonProtocol { let id: String init ( id: String ) { self.id = "SingletonProxy." + id } } 

ViewController.swift:

 import UIKit class ViewController: UIViewController { var duplicate: DuplicateProtocol? var singleton: SingletonProtocol? requinetworking init? ( coder aDecoder: NSCoder ) { print( "ViewController.init?", duplicate, singleton ) super.init( coder: aDecoder ) } override func viewDidLoad () { print( "ViewController.viewDidLoad", duplicate, singleton ) super.viewDidLoad() } } 

AppDelegate.swift:

 import Swinject import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application ( application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]? ) -> Bool { let container = Container() let singleton = SingletonProxy( id: "first" ) container.register( SingletonProtocol.self ) { _ in singleton } container.register( DuplicateProtocol.self ) { _ in DuplicateProxy( id: "second" ) } container.registerForStoryboard( ViewController.self ) { r, c in c.duplicate = r.resolve( DuplicateProtocol.self ) } print( "AppDelegate.application" ) return true } } 

Y este es el logging de la console que desgraciadamente obtengo:

 ViewController.init? nil nil AppDelegate.application ViewController.viewDidLoad nil nil 

Tan simple como pueda: ¿qué cambios debo hacer? Gracias, JBM.

    La inyección de inicializador no está disponible si desea instanciar el controller de vista desde un guión gráfico porque UIKit framework llama init?(coder:) .

    En cambio, la inyección de properties debe usarse para instanciarla desde un storyboard:

     class SomeViewController: UIViewController { var duplicate: DuplicateProtocol? var singleton: SingletonProtocol? requinetworking init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } } 

    ACTUALIZAR

    Aún la instanciación implícita de UIWindow y el controller de vista inicial no es compatible con Swinject. Debe instanciarlos explícitamente como lo hace el siguiente ejemplo.

     import Swinject import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var container: Container { let container = Container() let singleton = SingletonProxy( id: "first" ) container.register( SingletonProtocol.self ) { _ in singleton } container.register( DuplicateProtocol.self ) { _ in DuplicateProxy( id: "second" ) } container.registerForStoryboard( ViewController.self ) { r, c in c.duplicate = r.resolve( DuplicateProtocol.self ) } return container } func application ( application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]? ) -> Bool { let window = UIWindow(frame: UIScreen.mainScreen().bounds) window.makeKeyAndVisible() self.window = window let storyboard = SwinjectStoryboard.create(name: "Main", bundle: nil, container: container) window.rootViewController = storyboard.instantiateInitialViewController() return true } } 

    Por cierto, no tiene que manejar la instancia singleton por sí mismo. Swinject tiene Singleton (aka Container) Object Scope, que se puede configurar con .inObjectScope(.Container) como se documenta aquí .

    ACTUALIZACIÓN 2

    Swinject versión 0.3 admite la creación de instancias implícitas de UIWindow y su controller de vista raíz desde el guión gráfico "Principal". Aquí está su documentation .