Ios 使用Swinject时,如何将参数传递给resolve方法?
我有一个测试项目,我正试图将一个参数传递给项目中的resolve方法 下面是我的Swinject故事板extetion文件的示例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
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)
}
}
}