我有一个测试项目,我试图将参数传递给Swinject项目中的resolve方法.
这是我的Swinject故事板扩展文件中包含的示例.
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的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)! …
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用SwinjectSwift 3
.当我尝试
let container = Container()
container.register(NetworkModeling.self) { _ in Network() }
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说
Ambiguous reference to member 'register(_:name:factory:)'
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
这个问题是针对对Swinject for Swift有丰富经验的人。
我将展示有问题的代码,我的问题在底部。
代码有点多,抱歉。
这是MySwinjectStoryboard.swift
注册:
import Swinject
extension SwinjectStoryboard
{
class func setup ()
{
defaultContainer.register( Stopwatch.self )
{
responder in Stopwatch(
signals: responder.resolve( SignalsService.self )!
)
}
defaultContainer.register( SignalsService.self )
{
_ in SignalsService()
}.inObjectScope( .Container )
defaultContainer.register( ImageService.self )
{
responder in ImageService(
signals: responder.resolve( SignalsService.self )!
, stopwatch: responder.resolve( Stopwatch.self )!
)
}.inObjectScope( .Container )
defaultContainer.registerForStoryboard( StartUpViewController.self )
{
resolvable, viewController in
viewController.stopwatch = resolvable.resolve( Stopwatch.self )!
viewController.image = resolvable.resolve( ImageService.self )!
}
} …
Run Code Online (Sandbox Code Playgroud) 最近,我在尝试解析对象时开始崩溃。以下是崩溃日志。我可以看到,在 Container.swift 中的第 299 行, guard let currentObjectGraph = currentObjectGraph else { fatalError() }
应用程序没有获取 currentObjectGraph 并且失败了。可能的原因是什么?在我的项目中,我有一个全局级汇编器,它添加来自不同框架的所有程序集。但是当我尝试解析一个对象时,它会崩溃。这是一个中间问题:-
#15. Crashed: com.apple.NSURLSession-work
0 libswiftCore.dylib 0x109a1b95c specialized _assertionFailure(_:_:file:line:flags:) + 97848
1 Swinject 0x1096d4994 Container.resolve<A, B> (entry : ServiceEntryProtocol, invoker : (B) -> Any) -> A? (Container.swift:299)
2 Swinject 0x1096d2e54 Container._resolve<A, B> (name : String?, option : ServiceKeyOption?, invoker : ((B) -> Any) -> Any) -> A? (Container.swift:192)
3 Swinject 0x1096d582c Container.resolve<A> (A.Type, name : String?) -> A? (Container.swift:281)
4 Swinject 0x1096d5918 ContainerSwinjectResolver (Container.swift) …
Run Code Online (Sandbox Code Playgroud) 我创建了一个超级简单的协议:
protocol IndependentProtocol {}
Run Code Online (Sandbox Code Playgroud)
和服务:
class IndependentService: IndependentProtocol {}
Run Code Online (Sandbox Code Playgroud)
以及以下Swinject
注册工作:
defaultContainer.register( IndependentProtocol.self )
{
_ in IndependentService()
}
Run Code Online (Sandbox Code Playgroud)
但以下一项则不然:
defaultContainer.register( IndependentProtocol.self )
{
_ in IndependentService()
}.inObjectScope( .Container )
Run Code Online (Sandbox Code Playgroud)
给出的错误是:
Ambiguous reference to member 'register(_:name:factory:)'
Run Code Online (Sandbox Code Playgroud)
有趣的是,以下工作(即:带有参数的服务可以在.container
范围内注册):
defaultContainer.register( AnotherProtocol.self )
{
r in AnotherService(
signals: r.resolve( AnotherService.self )!
)
}.inObjectScope( .container )
Run Code Online (Sandbox Code Playgroud)
我读过这个类似的问题,这没有帮助:Swinject - 对成员的模糊引用
谢谢大家。