2017-07-03 7 views
0

メタタイプの配列を返す関数を作成しようとしていますが、Swinject Resolverのインスタンスを解決するために使用できます。ここに私のコード:Swinject:メタタイプのリストを使って解決する

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])のリストを定義できるということです。

答えて

0

したがって、この問題はプロトコルを使用している可能性があります。私は仕事のために次を得ることができます...

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) 
} 
関連する問題