从C ++ / Java / C#背景开始,我期望在Swift中看到虚拟方法,但是在阅读swift文档时,我没有提到虚拟方法。
我想念什么?
与C ++不同,不必在Swift中指定方法是虚拟的。编译器将计算出要使用以下哪个:
(性能指标当然取决于硬件)
当然,Objective-C始终使用后者。4.9ns的开销通常不是问题,因为这只占整个方法执行时间的一小部分。但是,必要时开发人员可以无缝地回退到C或C ++。但是,在Swift中,编译器将分析可以使用最快的哪个,并尝试代表您进行决策,支持内联,静态和虚拟,但保留用于Objective- C互操作性的消息传递。可以标记一种dynamic鼓励消息传递的方法。
dynamic
这样做的一个副作用是,动态分配所提供的某些强大功能可能不可用,因为以前假定任何Objective- C方法都是这种情况。动态分派用于方法拦截,依次由以下人员使用:
以上是late binding语言提供的功能。请注意,尽管Java使用vtable调度进行方法调用,但它仍被认为是一种后期绑定语言,因此由于具有虚拟机和类加载器系统而具有上述功能,这是提供运行时检测的另一种方法。“纯” Swift(不带Objective-C互操作)类似于C ++,因为它是具有静态分派的直接可执行的编译语言,因此在运行时这些动态功能是不可能的。按照ARC的传统,我们可能会看到更多此类功能正在编译时移动,这在“每瓦性能”方面具有优势- 这是移动计算中的重要考虑因素。
late binding