Swinject:使用元类型列表解析
Posted
技术标签:
【中文标题】Swinject:使用元类型列表解析【英文标题】:Swinject: Resolving using a list of metatypes 【发布时间】:2017-07-03 23:31:06 【问题描述】:我正在尝试创建一个函数来返回一个元类型数组,然后我可以使用它来解析来自 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]
)。
【问题讨论】:
【参考方案1】:所以问题可能在于使用协议。我可以让以下工作......
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 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)
【讨论】:
以上是关于Swinject:使用元类型列表解析的主要内容,如果未能解决你的问题,请参考以下文章