2017-07-03 64 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) 
}