Swinject:使用元类型列表进行解析
Swinject: Resolving using a list of metatypes
我正在尝试为 return 元类型数组创建一个函数,然后我可以使用它来解析来自 Swinject Resolver
的实例。这是我的代码:
protocol Task: class { }
func getTypes() -> [Task.Type] {
return [ConcreteTaskA.self, ConcreteTaskB.self]
}
var concreteTasks = [Task]()
for type in getTypes() {
// Use a Swinject Container to resolve the metatype.
let task = container.resolver.resolve(type)! // Error here: Cannot invoke 'resolve' with an argument list of type '(Task.Type)'
concreteTasks.append(task)
}
我不知道如何解决这个问题。我是否需要通过 getTypes()
方法以某种方式使用泛型?解析时是否需要调用 type.self
的等价物?
我的要求是我可以定义要由解析器解析的元类型列表 ([ConcreteTaskA.self, ConcreteTaskB.self]
)。
原来问题可能出在使用协议上。我可以让以下工作...
for type in getTypes() {
// Use a Swinject Container to resolve the metatype.
if let aType = type as? ConcreteTaskA.Type {
let task = container.resolver.resolve(aType)!
concreteTasks.append(task)
}
}
...但显然不需要先检查每种类型会更好。
如果我们将协议更改为基础 class,但是,一切都会按预期进行:
class Task { }
class ConcreteTaskA: Task { }
class ConcreteTaskB: Task { }
func getTypes() -> [Task.Type] {
return [ConcreteTaskA.self, ConcreteTaskB.self]
}
var concreteTasks = [Task]()
for type in getTypes() {
// Use a Swinject Container to resolve the metatype.
let task = container.resolver.resolve(type)!
concreteTasks.append(task)
}
我正在尝试为 return 元类型数组创建一个函数,然后我可以使用它来解析来自 Swinject Resolver
的实例。这是我的代码:
protocol Task: class { }
func getTypes() -> [Task.Type] {
return [ConcreteTaskA.self, ConcreteTaskB.self]
}
var concreteTasks = [Task]()
for type in getTypes() {
// Use a Swinject Container to resolve the metatype.
let task = container.resolver.resolve(type)! // Error here: Cannot invoke 'resolve' with an argument list of type '(Task.Type)'
concreteTasks.append(task)
}
我不知道如何解决这个问题。我是否需要通过 getTypes()
方法以某种方式使用泛型?解析时是否需要调用 type.self
的等价物?
我的要求是我可以定义要由解析器解析的元类型列表 ([ConcreteTaskA.self, ConcreteTaskB.self]
)。
原来问题可能出在使用协议上。我可以让以下工作...
for type in getTypes() {
// Use a Swinject Container to resolve the metatype.
if let aType = type as? ConcreteTaskA.Type {
let task = container.resolver.resolve(aType)!
concreteTasks.append(task)
}
}
...但显然不需要先检查每种类型会更好。
如果我们将协议更改为基础 class,但是,一切都会按预期进行:
class Task { }
class ConcreteTaskA: Task { }
class ConcreteTaskB: Task { }
func getTypes() -> [Task.Type] {
return [ConcreteTaskA.self, ConcreteTaskB.self]
}
var concreteTasks = [Task]()
for type in getTypes() {
// Use a Swinject Container to resolve the metatype.
let task = container.resolver.resolve(type)!
concreteTasks.append(task)
}