方法调整
在 Swift 中使用方法调配时,你的类/方法必须遵守两个要求:
- 你的类必须延长
NSObject
- 你想要调配的函数必须具有
dynamic
属性
有关为什么需要这样做的完整说明,请查看使用 Swift 与 Cocoa 和 Objective-C :
需要动态调度
虽然
@objc
属性将 Swift API 暴露给 Objective-C 运行时,但它不保证动态调度属性,方法,下标或初始化程序。 Swift 编译器仍然可以通过半虚拟化或内联成员访问来优化代码的性能,从而绕过 Objective-C 运行时。使用dynamic
修饰符标记成员声明时,始终会动态调度对该成员的访问。因为使用 Objective-C 运行时调度使用dynamic
修饰符标记的声明,所以使用@objc
属性隐式标记它们。要求动态调度很少是必要的。但是,当你知道在运行时替换 API 的实现时,必须使用
dynamic
修饰符。例如,你可以在 Objective-C 运行时使用method_exchangeImplementations
函数在应用程序运行时交换方法的实现。如果 Swift 编译器内联该方法的实现或对其进行虚拟化访问,则不会使用新的实现。