2017-06-23 3 views
1

Ich habe eine Reihe von verschiedenen Dingen ausprobiert, aber ich bin nicht gut in Generika. Wie rufe ich eine Funktion mit einer Variablen auf, die sowohl ein fester Typ wie UIViewController sein muss, als auch einem Protokoll wie NavBarResponder entspricht? Danke!Schnelle Generika, kann nicht Typ 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

Welche Swift-Version verwenden Sie? –

Antwort

0

Ich vermute, dass der Fehler ist, weil UIViewController nicht natürlich zu NavBarResponder entsprechen, so dass der Compiler kann nicht garantieren, dass lastNavBarResponder die Anforderungen der setup passt.

Versuchen Sie, lastNavBarResponder von einem Typ zu ändern, der UIViewController entspricht, der dem NavBarResponder Protokoll entspricht.

Hier ist ein eigenständiges Beispiel, das zeigt, wie dies implementiert werden würde.

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

danke für Ihre Hilfe! Ich habe das versucht, aber jetzt scheint es, dass ich jede Klasse, die momentan ein 'UIViewController' ist, konform zu 'NavBarResponder' dieser neuen Klasse 'NavBarResponderController' machen muss. Sonst kann ich 'lastNavBarResponder' nicht zuweisen. Gibt es eine andere Art und Weise? – xaphod

Verwandte Themen