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:使用元类型列表解析的主要内容,如果未能解决你的问题,请参考以下文章

Swinject - 如何从一个解析器两次解析同一个控制器?

函数 装饰器 生成器 列表解析式

列表解析2

python中的三元表达式,列表解析 和 生成器表达式

如何在 Flutter 中解析列表中的列表?

Azure 数据流:从 JSON 字符串解析对象的嵌套列表