【问题标题】:Swinject: Resolving using a list of metatypesSwinject:使用元类型列表解析
【发布时间】: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])。

【问题讨论】:

    标签: swift dependency-injection swinject


    【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多