2017-07-03 9 views
0

Ich versuche, eine Funktion zu erstellen, um ein Array von Metatypen zurückzugeben, die ich dann zum Auflösen von Instanzen aus einem Swinject Resolver verwenden kann. Hier ist mein Code:Swinject: Auflösen mit einer Liste von Metatypen

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) 
} 

Ich bin mir nicht sicher, wie man das löst. Muss ich Generika irgendwie mit der Methode getTypes() verwenden? Muss ich beim Entschlüsseln ein Äquivalent von type.self anrufen?

Meine Anforderungen sind, dass ich eine Liste von Metatypen ([ConcreteTaskA.self, ConcreteTaskB.self]) definieren kann, die von einem Resolver aufgelöst werden.

Antwort

0

So stellt sich heraus, dass das Problem bei der Verwendung eines Protokolls liegen kann. Ich kann Folgendes zur Arbeit bekommen ...

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) 
    } 
} 

... aber natürlich wäre es schön, wenn man nicht erst nach jedem Typ suchen müsste.

Wenn wir das Protokoll auf eine Basisklasse zu ändern, jedoch funktioniert alles wie erwartet:

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) 
} 
Verwandte Themen