dynamic modifier in functions in Swift

Victor Sigler picture Victor Sigler · Apr 16, 2015 · Viewed 8k times · Source

According to Apple :

When you mark a member declaration with the dynamic modifier, access to that member is always dynamically dispatched. Because declarations marked with the dynamic modifier are dispatched using the Objective-C runtime, they’re implicitly marked with the @objc attribute.

According to Wikipedia:

dynamic dispatch is the process of selecting which implementation of a polymorphic operation (method or function) to call at run time.

Dynamic dispatch is often used in object-oriented languages when different classes contain different implementations of the same method due to common inheritance. For example, suppose you have classes A, B, and C, where B and C both inherit the method foo() from A. Now suppose x is a variable of class A. At run time, x may actually have a value of type B or C and in general you can't know what it is at compile time.

Right now, I'm studying the dependency injection framework : Typhoon and when I open the sample project for Swift in all the classes that inherit from the Objective-C class TyphoonAssembly all the methods relatives to inject dependencies have the dynamic modifier included in the following way :

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

I thought that I'm missing something, but I don't understand where is the polymorphic operation (method or function) to call at run time here.

What's is the purpose of the dynamic dispatch here?

Answer

Scott Thompson picture Scott Thompson · Apr 1, 2016

The answer to your question is addressed in this post:

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

Basically at runtime the Typhoon Framework is going to replace your method with its own routine that implements the features of the framework and calls your method to do whatever work you've defined for it.

In order for the framework to be able to replace the method, the method must be dynamically dispatched.