首页 > 解决方案 > 防止在 Swift 中继承 Objective-C 类

问题描述

我正在向我的 Objective-C 类添加 Swift 内部注释。我试图阻止我的类被子类化:

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

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

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

但是,我仍然可以在 Swift 中进行子类化

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

}

问题:如何防止 Objective-C 类在 Swift 中被子类化?

标签: objective-cswiftsubclass

解决方案


Objective C 没有final关键字或类似的东西。即使确实存在编译时属性或修饰符,也可以通过使用运行时 API 来动态创建任何 psuedofinal 类的子类来轻松地将其排除在外。

Swift 编译器强制 Swift 可以阻止尝试子类化一个final类,但这不会阻止 Objective C 能够这样做(它不是通过 Swift 编译器编译的)。因此,objc_subclassing_restricted添加了该属性,特别是使 clang 强制执行子类化finalSwift 类的非法性。

使 Objective C 类最终化并没有太大的好处,即使它是可能的。Objective C 是一种更加动态的语言,它似乎遵循 Python 的“我们都是成年人”的口头禅。

支持final类的最大原因是通知编译器哪些类是去虚拟化的候选对象。但是Objective C 总是使用动态调度,并且无论如何都不会进行去虚拟化。


推荐阅读