1

我正在尝试创建一个函数来返回一个元类型数组,然后我可以使用它来解析来自 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]由解析器解析的元类型 ( ) 列表。

4

1 回答 1

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)
}
于 2017-07-07T20:06:18.847 回答