2015-11-23 4 views
14

Beachten Sie Folgendes:Swift Property Observer in Protokollerweiterung?

protocol ViewControllable: class { 
    typealias VM: ViewModellable 
    var vm: VM! { get } 
    func bind() 
} 

extension ViewControllable { 
    var vm: VM! { 
    didSet { 
     bind() 
    } 
    } 
} 

Ich versuche vm Eigentum zu beobachten und bind nennen, wenn es injiziert wird. Aber dies nicht kompiliert mit Fehler Spruch:

Erweiterungen können nicht gespeichert Eigenschaften enthalten

was Sinn macht, da Protokoll kann nicht Eigenschaften erzwingen stored oder computed sein.

Ist dies möglich, ohne Einführung class inheritance?

Mit anderen Worten, Kann ich die Änderung einer Eigenschaft innerhalb der Protokollerweiterung beobachten?

+0

Beachten Sie, dass Sie dies sehr einfach tun können, wenn Sie eine zugeordnete Eigenschaft * verwenden. Hier ist ein neuer Post von mir über genau, wie man eine verbundene Eigenschaft herstellt: [Beispiel] (http://stackoverflow.com/documentation/swift/1085/associated-objects/27656/property-in-a-protocol-extension-achieved -using-associated-object # t = 20170128181236289743) Das ist ziemlich frisch, als dies geschrieben wurde, also hoffentlich ist es ziemlich stabil. – Fattie

+0

In Bezug auf diese Frage ist ein Beispiel für die Verwendung dieses Beispiels das Beispiel, das in dieser QA verwendet wird: http://stackoverflow.com/questions/41910120/in-swift3-combine-respryststo-and-calling-in-one- Sturzflug – Fattie

Antwort

24

Nein, dies ist ausdrücklich nicht erlaubt. Siehe Extension: Computed Properties:

Erweiterungen können neue berechneten Eigenschaften hinzufügen, aber sie können nicht gespeichert Eigenschaften hinzufügen, oder fügen Sie Eigenschaft Beobachter vorhandenen Eigenschaften.

Beachten Sie, dass, wenn dies legal wäre, würde es einige nicht-triviale Verwirrung über die Reihenfolge der Ausführung hinzufügen. Stellen Sie sich vor, es gäbe mehrere Erweiterungen, die hinzugefügt wurden didSet, und die tatsächliche Implementierung hatte auch eine didSet. In welcher Reihenfolge sollten sie laufen? Dies bedeutet nicht, dass es unmöglich zu implementieren ist, aber es könnte etwas überraschend sein, wenn wir es hätten.

+2

Danke für die Klarstellung. Aber ich stimme nicht überein über die Verwirrung, die es mit sich bringen könnte. Viele andere Programmiersprachen befassen sich mit dieser Art von Diamantproblem, indem sie entweder explizit mit einem Kompilierungsfehler oder aus der Reihenfolge der Deklarationen abgeleitet werden. Scala zum Beispiel, wenn in Konflikten, priorisieren, welches "Merkmal" ("Protokoll") nach dem in der Klasse "extends" (':') deklariert wird. –

+0

> "In welcher Reihenfolge sollen sie laufen?" wirklich? Ich wollte natürlich diese Funktionalität haben. Eg. Sie haben einen neuen Kunden. Die einzige Information, die Ihnen wichtig ist, ist seine eindeutige Kennung. Sie legen die Kennung fest. Bis zum Setzen dieser Kennung gehen Protokollmethoden und holen alle Informationen über den Kunden, die wir brauchen. Nicht schwer, Code in der richtigen Reihenfolge auszuführen Ich möchte, dass der Code sich um den Rest kümmert, ohne sich darum kümmern zu müssen, alle Funktionen manuell aufzurufen. Wie es jetzt ist, fühlt es sich unangenehm, mit Protokollen und Erweiterungen ohne diese – Ferologics

+0

uuuh Herzschmerz zu arbeiten :( –