Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swinject将模型类实例注入Swift中的视图类实例_Ios_Swift_Dependency Injection_Swinject - Fatal编程技术网

Ios 使用Swinject将模型类实例注入Swift中的视图类实例

Ios 使用Swinject将模型类实例注入Swift中的视图类实例,ios,swift,dependency-injection,swinject,Ios,Swift,Dependency Injection,Swinject,在XCode 7.0.1中的Swift 2.0单页应用程序项目中,我使用Swift依赖项注入框架执行以下操作: 复制协议.swift: protocol DuplicateProtocol { var id: String { get } } protocol SingletonProtocol { var id: String { get } } SingletonProtocol.swift: protocol DuplicateProtocol { var id: String { g

在XCode 7.0.1中的Swift 2.0单页应用程序项目中,我使用Swift依赖项注入框架执行以下操作:

复制协议.swift:

protocol DuplicateProtocol { var id: String { get } }
protocol SingletonProtocol { var id: String { get } }
SingletonProtocol.swift:

protocol DuplicateProtocol { var id: String { get } }
protocol SingletonProtocol { var id: String { get } }
斯威夫特先生

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?

    required 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
    }
}
这是我不幸得到的控制台日志:

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

简单地说:我需要做什么改变?谢谢你,JBM。

如果你想从故事板实例化视图控制器,则初始化器注入不可用,因为UIKit框架调用
init?(编码器:)

相反,应该使用属性注入从故事板实例化它:

class SomeViewController: UIViewController {
    var duplicate: DuplicateProtocol?
    var singleton: SingletonProtocol?

    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }
}
更新

Swinject仍然不支持UIWindow和初始视图控制器的隐式实例化。您需要像下面的示例那样显式地实例化它们

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
    }
}
顺便说一下,您不必自己处理singleton实例。Swinject具有Singleton(又名容器)对象作用域,可以使用
.inObjectScope(.Container)
设置该作用域

更新2


Swinject版本0.3支持从“主”情节提要隐式实例化UIWindow及其根视图控制器

我想添加标记swinject,但我的代表似乎还不够高。我也没有添加标记的特权。如果有人添加swinject标签,这会很有帮助。克劳迪奥,谢谢你添加标签。嗨,Yoichi。我编辑了我的原始问题,既包含了您提出的建议,也发布了一个简单测试项目的全部代码,因为我试图实现您的建议,但没有成功。我确信我做错了什么,这对你来说是显而易见的,但对我来说不是,所以我发布了我的全部精简代码。你让我失去了一点Yoichi,因为你说“如果你想从故事板实例化视图控制器,初始化器注入是不可用的”,然后马上说“属性注入应该用于从故事板实例化它。”那么它是否应该从故事板实例化?您的意思是它应该是:var newViewController=app.storyboard.instanceeviewcontrollerwhiteIdentifier(“ViewController”)-->app.window.rootViewController=newViewController-->app.window.makeyAndVisible()?可以从故事板(SwinjectStoryboard)进行实例化。初始值设定项注入和属性注入的区别在于。希望能有所帮助。很好的Yoichi,谢谢。谢谢你对我愚蠢的问题这么客气。