方法调整

在 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 编译器内联该方法的实现或对其进行虚拟化访问,则不会使用新的实现

链接

Objective-C 运行时参考

方法在 NSHipster 上晃荡