防止在 Swift 中子类化 Objective-C 类

Prevent Subclassing Objective-C Classes in Swift

我正在为我的 Objective-C class 添加 Swift 内部注释。我正在努力防止我的 class 被 subclassed:

__attribute__((objc_subclassing_restricted))
@interface CWTestFinalClass : NSObject
@end

这在 Objective-C 中按预期工作:

// Generates Error, as expected
@interface CWTestSubclass : CWTestFinalClass
@end

但是,我仍然可以在 Swift

中加入 class
// Should fail, but works without error
class TestSubclass: CWTestFinalClass {

}

问题: 如何防止 Objective-C classes 在 Swift 中被子class编辑?

Objective C 没有 final 关键字或类似关键字。即使确实存在编译时属性或修饰符,也可以通过使用运行时 API 动态创建任何伪最终 class 的子 class 来轻松地将其搁置一旁。

Swift 编译器强制要求 Swift 可以阻止对 subclass a final class 的尝试,但这不会阻止 Objective C 能够这样做(不是通过 Swift 编译器编译的)。因此,添加了 objc_subclassing_restricted 属性,专门使 clang 强制执行 subclassing final Swift classes 的非法性。

将 Objective C class 定为最终版本确实没有太大好处,即使有可能。 Objective C 是一种更加动态的语言,似乎遵循了 Python 的 "we're all adults here" 口头禅。

支持 final classes 的最大原因是通知编译器哪些 classes 是去虚拟化的候选对象。但是Objective C总是使用动态调度,而且从不去虚拟化。