gpt4 book ai didi

ios - Swift 是否支持面向方面的编程?

转载 作者:IT王子 更新时间:2023-10-29 05:16:28 27 4
gpt4 key购买 nike

我是一名 iOS 开发人员,正在尝试学习面向方面的编程,但 Swift 是否支持面向方面的编程?

最佳答案

Aspect Oriented Programming的基础是拦截模式。我们从横切需求开始——需要在应用程序的许多部分出现的东西。然后使用切入点表达式,通过识别应应用此要求的所有位置对其进行模块化。这是通过拦截方法调用并编织其他行为来完成的。因此,一个语言要支持AOP,就必须支持拦截模式。

现在,根据语言的不同,方法拦截可以在编译时、运行时或两者都应用。 Swift 在这方面是一个有趣的案例,因为它支持以下类型的方法分派(dispatch):

  • 静态/vtable,如 C++(更快:在测试中占方法调用时间的大约 1.1 纳秒或更少)
  • Messaging ,像 Objective-C (较慢:在测试中占大约 4.9 纳秒的方法调用时间)。也称为动态调度后期绑定(bind)

如果您扩展 NSObject 或使用 @objc 装饰,则将使用消息传递。否则 Swift 将恢复为静态/vtable 方法调用。

  • 使用静态/vtable 类型的分派(dispatch),只能进行编译时拦截。在 C++(和 Swift)的情况下,这涉及在实际编译之前使用生成新源代码的预处理器。这是一种有些麻烦的方法,需要花费更多的精力来开发必要的工具。尽管它确实提供了最佳性能。
  • 通过方法调用的消息传递风格,运行时拦截也是可用的。事实上,Objective-C 使拦截变得如此简单,以至于没有正式的 AOP 框架。它可能有用,但“原 Material ”太好了,没有人费心去做。 Cooca 的许多最佳功能都利用了 Objective-C 的动态调度和拦截方法调用的能力。

总结:

  • 如果您扩展 NSObject 或使用 '@objc' 装饰,Swift 将支持运行时 AOP。这有一些怪癖和限制——Apple 的关于在 Swift 中使用 KVO 的指南将指出其中的大部分。
  • 如果您不扩展 Objective-C 基础或不使用“@objc”装饰,则只能进行编译时 AOP。目前还没有这样的库来提供编译时 AOP。此外,编译时 AOP 的一个缺点是它只适用于您拥有源代码的类。

NB1:一些语言,例如 Java 使用静态/vtable 风格的方法分派(dispatch),并且仍然支持运行时方法拦截。这是可能的,因为它们依赖于虚拟机,以及一个类加载器,这是另一个 Hook 点。事实上,正因为如此,Java 仍被归类为“后期绑定(bind)”语言。

NB2: 在技术上可以支持针对编译为机器代码的二进制文件提供编译时编织,但有一些限制。首先是没有太多的工具来支持这一点,因为实现工作量很大,而且必须在每个平台上重复。第二个是它限制了可用的 AOP 特性。

关于ios - Swift 是否支持面向方面的编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24136535/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com