2015-07-29 9 views
6

Ok, so haben wir UIScrollView Erklärung:Delegate Eigenschaft mit unterschiedlicher Art in Swift

protocol UIScrollViewDelegate: NSObjectProtocol { ... } 
class UIScrollView: UIView { 
    ... 
    weak var delegate: UIScrollViewDelegate? 
    ... 
} 

Und dann UITableView mit delegate Variante?

protocol UITableViewDelegate: NSObjectProtocol, UIScrollViewDelegate { ... } 
class UITableView: UIScrollView { 
    ... 
    weak var delegate: UITableViewDelegate? 
    ... 
} 

Wie hat Apple das gemacht? Wenn ich meine

protocol MyScrollViewSubclassDelegate: NSObjectProtocol, UIScrollViewDelegate { ... } 
class MyScrollViewSubclass: UIScrollView { 
    ... 
    weak var delegate: MyScrollViewSubclassDelegate? 
    ... 
} 

ich Property 'Delegierten mit Typ 'MyScrollViewSubclassDelegate?' kann eine Eigenschaft mit dem Typ 'UIScrollViewDelegate' nicht überschreiben? '.

+0

Was passiert, wenn Sie Ihre Unterklasse auf UITableView setzen. Klasse MyScrollViewSubclass: UITableView – jarryd

+0

Gleiches Problem ... –

+0

Haben Sie Protokollerweiterungen in Swift 2.0 versucht? – jarryd

Antwort

2

MyScrollViewSubclass hat die Delegat-Eigenschaft von UIScrollView, weil es eine Unterklasse von UIScrollView ist.

Da delegate bereits von UIScrollView definiert wurde, können Sie nicht denselben Eigenschaftsnamen mit einem neuen Typ definieren.

Ändern Sie den Variablennamen delegate zu myDelegate (oder etwas anderes), und es sollte funktionieren.

+0

Das war alles, was ich brauchte, um das Problem zu beheben. – Fra

3

Ich bin ein paar Mal darüber gestolpert und das einzige Workaround, das ich gefunden habe, war, einfach mein Eigentum etwas anderes anzurufen, wie CustomDelegate oder was immer du magst.

Es wäre in der Tat in Ordnung, in der Lage zu sein, es Delegat zu nennen, aber hey!

+0

Das gleiche hier. Aber ... heute habe ich gemerkt, dass Apple es tut. Und ich bin nur ernsthaft neugierig wie! –

+0

Haben Sie versucht, "unowned (unsichere) var-Delegat: MyScrollViewSubclassDelegate?"? Dies ist, was ich in der UITableView-Quelle sehe. – Skoua

+0

Ich sehe dort "schwach". Entweder 'unowned' kann nicht auf den Nicht-Klassen-Typ' MyScrollViewSubclassDelegate' angewendet werden. –

0

Ich habe das funktioniert, aber ich mag die Lösung nicht sehr, da es Typprüfung wegwirft.

Was ich getan habe, war dies. In meiner Basisklasse erklärte ich die Delegierten als

weak var delegate: AnyObject? = nil 

Dann, wenn ich eine Methode auf den Delegierten nennen will ich tun

if let delegate = self.delegate as? MyBaseClassProtocol { delegate.myMethod() } 

In meiner Unterklasse kann ich dann auch die gleiche Art der Sache zu tun

if let delegate = self.delegate as MySubclassProtocol { delegate.mySubclassMethod() } 

Wie gesagt, es funktioniert, aber ich mag es nicht sehr. Die Tippfehler wegzuwerfen ist meines Erachtens nicht leichtfertig. Ich teile nur die Hoffnung, dass jemand mit stärkeren Swift-Fähigkeiten es verbessern oder korrigieren kann.

Verwandte Themen