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 Modifiziererdynamic
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
undC
, wobeiB
undC
beide die Methodefoo()
vonA
erben. Angenommen,x
ist eine Variable der KlasseA
. Zur Laufzeit kannx
tatsächlich einen Wert vom TypB
oderC
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?
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. –
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