2016-07-28 33 views
0

My功能正在其中符合某個協議得到當試圖調用一個通用的功能參數,迅速

// This is my function 
    func instantiateViewController<T: ViewControllerIdentifier>(viewController: UIViewController) -> T 
    { 
     let controller = instantiateViewControllerWithIdentifier(viewController.identifier) as! T 
     return controller 
    } 

    // This is an extension of my protocol 
    extension ViewControllerIdentifier where Self: UIViewController 
    { 
     var identifier: String 
     { 
      return String(self) 
     } 
    } 

的在另一個類的通用類型參數的ERRO,我通過上述調用實例化一個視圖控制器功能類似以下內容:

let editAssignmentViewController = storyboard.instantiateViewController(MyTestClass) 

然而,Xcode是給我一個錯誤,如下面

Cannot convert value of type '(MyTestClass).Type' (aka 'MyTestClass') to expected argument type 'UIViewController' 

有誰知道我的思念,以及如何解決這個錯誤

+1

你已經定義了'instantiateViewController'來接受一個'UIViewController'的實例的參數,並且你將它傳遞給一個類型,而不是一個實例。這就是爲什麼你會得到你的錯誤。 – Rob

+0

@rob:我的目標是將MyTestClass傳遞到'instantiateViewController'方法時,我期待返回將是'MyTestClass'視圖控制器。 – tonytran

+0

@rob:現在我正在將該類型傳遞給我的方法。是否將參數更改爲類型而不是UIViewController? – tonytran

回答

1

我收集你的目的是要能夠做這樣的事情:

let controller = storyboard!.instantiateViewController(SomeViewController) 

如果這就是你想要的這樣做,它似乎可以在沒有任何協議來實現,用簡單:

extension UIStoryboard { 
    func instantiateViewController<T: UIViewController>(viewController: T.Type) -> T { 
     return instantiateViewControllerWithIdentifier(String(T)) as! T 
    } 
} 

我必須承認,我更願意堅持使用標準

let controller = storyboard!.instantiateViewControllerWithIdentifier("SomeViewController") as! SomeViewController 
+0

該標準使用「SomeViewController」。我想通過使用視圖控制器的確切名稱來避免它。因此,您可以避免錯字。 – tonytran