Swift函数中的动态修饰符

Vic*_*ler 13 inheritance dynamic dynamic-dispatch ios swift

根据Apple的说法:

使用dynamic修饰符标记成员声明时,始终会动态调度对该成员的访问.因为dynamic使用Objective-C运行时调度使用修饰符标记的声明,所以使用该@objc属性隐式标记它们.

根据维基百科:

动态分派是选择在运行时调用多态操作(方法或函数)的实现的过程.

当不同的类由于公共继承而包含相同方法的不同实现时,动态分派通常用于面向对象的语言中.例如,假设您有类A,BC,B以及从哪里C继承该方法.现在假设是一个类的变量.在运行时,实际上可能具有类型的值,或者通常在编译时无法知道它是什么.foo()AxAxBC

现在,我正在研究 依赖注入框架:Typhoon,当我在从Objective-C类继承的所有类中打开Swift的示例项目时,TyphoonAssembly注入依赖项的所有方法相关都具有dynamic以下方式包含的修饰符:

public dynamic func weatherReportDao() -> AnyObject {
    return TyphoonDefinition.withClass(WeatherReportDaoFileSystemImpl.self)
}
Run Code Online (Sandbox Code Playgroud)

我以为我错过了一些东西,但我不明白在运行时调用多态操作(方法或函数)在哪里.

这里动态调度的目的是什么?

Sco*_*son 5

本文将解答您的问题的答案:

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

基本上在运行时,Typhoon Framework将用自己的例程替换你的方法,该例程实现了框架的功能,并调用你的方法来完成你为它定义的任何工作.

为了使框架能够替换方法,必须动态调度该方法.