2017-06-23 90 views
1

我試過了一堆不同的東西,但我不擅長泛型。 如何調用一個變量,該變量既需要像UIViewController這樣的固定類型,又要符合像NavBarResponder這樣的協議? 謝謝!Swift的泛型,不能推斷T型

weak var lastNavBarResponder: UIViewController? 

func reloadExtendedNavBar() { 
    self.updateState() 
    self.updateStatusBadges() 
    if let vc = self.lastNavBarResponder { 
     self.setup(viewController: vc) // Error: Generic parameter T cannot be inferred 
    } 
} 

func setup<T: UIViewController>(viewController: T) where T: NavBarResponder { 
... 
+0

您使用哪個Swift版本? –

回答

0

我懷疑的錯誤是因爲UIViewController不自然符合NavBarResponder,所以編譯器不能保證lastNavBarResponder適合的setup要求。

嘗試將lastNavBarResponder更改爲符合NavBarResponder協議的UIViewController類型。

這是一個獨立的示例,顯示了這將如何實施。

protocol NavBarResponder {} 

class NavBarResponderController: UIViewController {} 
extension NavBarResponderController: NavBarResponder {} 

var lastNavBarResponder: NavBarResponderController? = NavBarResponderController() 

func setup<T: UIViewController>(viewController: T) where T: NavBarResponder { 
    print("Works") 
} 

func reloadExtendedNavBar() { 

    if let vc = lastNavBarResponder { 
     setup(viewController: vc) 
    } 
} 

reloadExtendedNavBar() 
+0

感謝您的幫助!我試過了,但現在看來我需要使每個當前是'UIViewController'的類符合'NavBarResponder'這個新類,'NavBarResponderController'。否則,我不能分配'lastNavBarResponder'。有另一種方法嗎? – xaphod