Swift有动态调度和虚拟方法吗?

 陪-祥到最-後 发布于 2023-01-11 21:03

从C++/Java/C#背景开始我希望在Swift中看到虚拟方法,但是阅读swift文档我没有提到虚拟方法.

我错过了什么?

2 个回答
  • 与C++不同,没有必要指定方法在Swift中是虚拟的.编译器将确定以下哪项使用:

    (性能指标当然取决于硬件)

    内联方法:0 ns

    静态调度:<1.1ns

    虚拟调度1.1ns(指定时为Java,C#或C++).

    动态调度4.9ns(如Objective-C).

    Objective-C当然总是使用后者.4.9ns开销通常不是问题,因为这将占整个方法执行时间的一小部分.但是,必要时开发人员可以无缝地回退到C或C++.然而,在Swift中,编译器将分析哪个最快可以使用并尝试代表您做出决定,支持内联,静态和虚拟,但保留Objective-C互操作性的消息.可以标记一种dynamic鼓励消息传递的方法.

    这样做的一个副作用是动态调度提供的一些强大功能可能无法使用,因为之前可以假设任何Objective-C方法都是如此.动态调度用于方法拦截,后者又用于:

    可可式的财产观察员.

    CoreData模型对象检测.

    面向方面编程

    上述功能的类型是late binding语言提供的功能.请注意,虽然Java使用vtable dispatch进行方法调用,但它仍然被认为是一种后期绑定语言,因此具有上述功能,因为它具有虚拟机和类加载器系统,这是提供运行时检测的另一种方法."Pure"Swift(没有Objective-C interop)就像C++一样,是一种带有静态调度的直接可执行编译语言,然后这些动态特性在运行时是不可能的.在ARC的传统中,我们可能会看到更多这类功能转向编译时间,这为"每瓦性能"提供了优势 - 这是移动计算中的一个重要考虑因素.

    2023-01-11 21:11 回答
  • 所有方法都是虚拟的。但是,您需要声明要使用override关键字从基类覆盖方法:

    从《Swift编程指南》中:

    覆写

    子类可以提供自己的实例方法,类方法,实例属性或下标的自定义实现,否则该实例方法将从超类继承。这称为覆盖。

    要覆盖原本会被继承的特征,请在覆盖定义的前面加上override关键字。这样做可以澄清您打算提供替代,并且没有错误地提供匹配的定义。意外覆盖可能会导致意外行为,并且override在编译代码时,任何没有关键字的覆盖都会被诊断为错误。

    override关键字还提示斯威夫特编译器检查您的覆盖类的超(或父母中的一方)有符合您的覆盖提供的一个声明。此检查可确保您的替代定义正确。

    2023-01-11 21:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有