2015-04-16 13 views
13

Laut Apple:dynamischer Modifikator in Funktionen in Swift

Wenn Sie ein Mitglied Deklaration mit dem dynamic Modifikator markieren, den Zugang zu diesem Mitglied immer dynamisch geschickt. Da Deklarationen, die mit dem Modifizierer dynamic markiert sind, mithilfe der Objective-C-Laufzeit ausgelöst werden, sind sie implizit mit dem Attribut @objc gekennzeichnet.

Nach Wikipedia:

dynamischer Dispatch ist der Prozess des Auswählens der Implementierung einer polymorphen Operation (Methode oder Funktion) zur Laufzeit nennen.

Dynamischer Versand wird oft in objektorientierten Sprachen verwendet, wenn verschiedene Klassen aufgrund gemeinsamer Vererbung verschiedene Implementierungen derselben Methode enthalten. Angenommen, Sie haben die Klassen A, B und C, wobei B und C beide die Methode foo() von A erben. Angenommen, x ist eine Variable der Klasse A. Zur Laufzeit kann x tatsächlich einen Wert vom Typ B oder C haben und im Allgemeinen können Sie nicht wissen, was es zur Kompilierzeit ist.

Im Moment studiere ich die dependency injection Rahmen: Typhoon und wenn ich das Beispielprojekt für Swift in allen Klassen öffnen, die von der Objective-C-Klasse erben TyphoonAssembly alle Methoden Verwandte Abhängigkeiten zu injizieren haben die dynamic Modifikator in der folgenden Art und Weise enthält:

public dynamic func weatherReportDao() -> AnyObject { 
    return TyphoonDefinition.withClass(WeatherReportDaoFileSystemImpl.self) 
} 

ich dachte, dass ich etwas fehle, aber ich verstehe nicht, wo ist die polymorphe Operation (Methode oder Funktion) hier zur Laufzeit nennen.

Was ist der Zweck der dynamischen Versand hier?

+1

Hmmm, die Docs sind da ein bisschen komisch. Wenn der Großteil der Welt, einschließlich wikipedia, "dynamic dispatch" meint, meinen sie normalerweise die Art von Laufzeitpolymorphismus, die von übergeordneten Klassenmethoden herrührt. Und in Swift geschieht dies ohne das 'dynamic'-Schlüsselwort und wird 100% der Zeit funktionieren, trotz der Tatsache, dass die Docs düsterer über Inlining und Devirtualization sind. Aber hier, wenn sie "dynamisch" sagen, meinen sie die Art verrückter extradynamischer Runtime-Shenanigans, die man mit dem Methoden-Dispatch "objc_msgSend" erreichen kann. –

+2

Ohne auf die Implementierung von Typhoon einzugehen, ist es möglich, dass sie sich dafür entschieden haben, dynamischen Versand zu verwenden, um sie KVO-kompatibel zu machen, um sie woanders zu verwenden.Michael Tsais Blog hat eine interessante Diskussion über 'dynamic' hier: [http://mjtsai.com/blog/2014/08/18/its-a-coup/](http://mjtsai.com/blog/2014/ 08/18/sein-a-coup /) – user2067021

Antwort

5

Die Antwort auf Ihre Frage in diesem Beitrag nicht angesprochen wird:

https://github.com/appsquickly/typhoon/wiki/TyphoonAssembly

Grundsätzlich zur Laufzeit des Taifun Rahmen Ihrer Methode mit einer eigenen Routine ersetzen wird, die die Merkmale des Framework implementiert und ruft Ihre Methode, um die von Ihnen definierte Arbeit zu erledigen.

Damit das Framework die Methode ersetzen kann, muss die Methode dynamisch ausgelöst werden.