Ios 使用Swinject时,如何将参数传递给resolve方法?

Ios 使用Swinject时,如何将参数传递给resolve方法?,ios,swift,dependency-injection,swinject,Ios,Swift,Dependency Injection,Swinject,我有一个测试项目,我正试图将一个参数传递给项目中的resolve方法 下面是我的Swinject故事板extetion文件的示例 import Swinject extension SwinjectStoryboard { class func setup() { let mainDm = MainDM() defaultContainer.register(MainDM.self) { _ in mainDm

我有一个测试项目,我正试图将一个参数传递给项目中的resolve方法

下面是我的Swinject故事板extetion文件的示例

import Swinject

extension SwinjectStoryboard {

    class func setup() {

        let mainDm = MainDM()

        defaultContainer.register(MainDM.self) { _ in
            mainDm
        }

        defaultContainer.registerForStoryboard(ViewController.self) { r, c in
            c.dm = r.resolve(MainDM.self)
            c.container = defaultContainer

        }


        defaultContainer.register(GetMessageAction.self) { _, delegate in
            GetMessageAction(dm:mainDm, delegate: delegate)
        }

    }

}
在我的ViewController中,我尝试执行以下操作来解析GetMessageAction

@IBOutlet weak var myText: UILabel!

    var dm:MainDM!
    var container:Container!

    override func viewDidLoad() {
        super.viewDidLoad()

        NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(3), target: self, selector: #selector(ViewController.getMessage), userInfo: nil, repeats: false)

    }

    func getMessage() {

        let action:GetMessageAction? = container.resolve(GetMessageAction.self, argument: self)!
        action?.execute()

    }
当getMessage函数运行时,我收到以下消息

致命错误:在展开可选值时意外发现nil


使用故事板的以下任一方法获取由
registerForStoryboard
注册的视图控制器

  • 实例化eviewcontrollerwhiteIdentifier
  • 实例化初始化视图控制器

由于使用参数解析依赖于完全匹配的参数类型,因此需要向下转换传递的对象:

container.resolve(GetMessageAction.self, argument: self as GetMessageActionDelegate)!

假设
GetMessageActionDelegate
是在构造函数
GetMessageAction(dm:delegate:)
中传递的委托类型,您在故事板中创建的ViewController的swift文件必须声明init(NSCoder),实际上README.md中没有提到它,我正在考虑就这件事开一个话题

   required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
您可以查看我的,我正在使用示例设置依赖项


一旦您拥有了所需的init,它就应该可以工作了!:)

这并不能解释为什么我不能将参数传递给resolve(GetMessageAction.self,argument:self)。很抱歉我的误解。我没有时间仔细阅读您的问题。我认为您是通过其初始值设定项实例化了
ViewController
,而不是通过
instanceeviewcontrollerwhidentifier
instanceinitialviewcontroller
。这就是为什么
ViewController
container
属性没有被注入,而您得到了错误。如果使用
instantiate*
方法中的任何一种,我认为
resolve
方法对于
GetMessageAction
和参数应该可以工作,因为
container
属性被注入,而它不是
nil
。我尝试了您的建议并遵循了文档,无论出于何种原因,这仍然不起作用。如果我在ViewController中检查容器,我会看到所有对象的服务和键,但它不会返回我的类。你能看一下我的项目,以便了解更多的情况,看看我可能做错了什么吗?执行此操作时,仍然会出现以下错误致命错误:在展开可选值时意外发现nil
extension SwinjectStoryboard {
    class func setup() {

        defaultContainer.register(HTTPClientProtocol.self) { _ in
            HTTPClient()
        }.inObjectScope(.Container)

        defaultContainer.register(APIClientProtocol.self) { r in
            APIClient(
                httpClient: r.resolve(HTTPClientProtocol.self)!
            )
        }.inObjectScope(.Container)

        defaultContainer.register(ImagePrefetcherProtocol.self) { _ in
            ImagePrefetcher()
        }.inObjectScope(.Container)

        defaultContainer.registerForStoryboard(GameVC.self) { r, c in
            c.imagePrefetcher = r.resolve(ImagePrefetcherProtocol.self)
        }

        defaultContainer.registerForStoryboard(LoadingDataVC.self) { r, c in
            c.apiClient = r.resolve(APIClientProtocol.self)
            c.imagePrefetcher = r.resolve(ImagePrefetcherProtocol.self)
        }
    }
}