防止在 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总是使用动态调度,而且从不去虚拟化。
我正在为我的 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总是使用动态调度,而且从不去虚拟化。