13

根据苹果:

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

根据维基百科:

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

当不同的类由于共同的继承而包含相同方法的不同实现时,动态分派通常用于面向对象的语言中。例如,假设您有类ABC,其中B和都从C继承方法。现在假设是一个变量 class 。在运行时,实际上可能有一个类型的值,或者通常你在编译时不知道它是什么。foo()AxAxBC

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

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

我以为我遗漏了一些东西,但我不明白在这里运行时要调用的多态操作(方法或函数)在哪里。

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

4

1 回答 1

5

您的问题的答案在这篇文章中得到解决:

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

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

为了使框架能够替换方法,必须动态分派方法。

于 2016-04-01T06:39:58.760 回答