2016-05-28 18 views
0

sagen, dass ich ein Protokoll habenWie Protokoll anzupassen Unterklasse mit

protocol A: class { 
    func configure(view: UIView) 
} 

Jetzt habe ich zu diesem Protokoll entsprechen wollen, UILabel als Unterklasse von UIView

final class B: A { 
    init() {} 

    func configure(view: UILabel) { 

    } 
} 

Aber Fehler mit

Typ B entspricht nicht dem Protokoll A

Es scheint, dass Swift genau den gleichen Typ wie im Protokoll angegeben benötigt. Dies funktioniert

final class B: A { 
    init() {} 

    func configure(view: UIView) { 

    } 
} 

Aber ich möchte verwenden UILabel, wie dies zu umgehen?

+0

Warum das configure-Methode des Protokolls kann nicht erwarten, dass ein 'UILabel' anstelle einem' UIView' wenn das nicht das ist, was du willst? –

+1

Nehmen wir an, Sie erstellen eine Instanz Ihrer Klasse B. Nun nehmen wir an, Sie haben sie auf Ihren Protokolltyp A übertragen. Jetzt haben Sie eine Instanz, die anscheinend jede 'UIView' als Argument für Ihre gegebene Methode akzeptieren kann es geht nur speziell auf "UILabels" ein - weshalb dieser Code nicht kompilieren kann. – Hamish

Antwort

2

Sie könnten eine associatedType verwenden, die auf den Typ UIView beschränkt ist.

protocol A: class { 
    associatedtype View: UIView 
    func configure(view: View) 
} 

nun in der Klasse B, da UILabel eine Unterklasse von UIView ist, ist es in Ordnung zu tun:

final class B: A { 
    init() {} 

    func configure(view: UILabel) { 
     ... 
    } 
} 
+0

Sie rocken, danke – onmyway133

+0

Kein Problem, glücklich zu helfen! – ABakerSmith