我正在为我的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 {
}
问题:如何防止在Swift中对Objective-C类进行子类化?
答案 0 :(得分:2)
目标C没有array_values(array_filter($data))
关键字或类似关键字。即使确实存在编译时属性或修饰符,也可以使用运行时API来动态创建任何伪类的子类,从而使它显得微不足道。
Swift编译器强制Swift可以阻止对final
类进行子类化的尝试,但这不会阻止Objective C这样做(它不是通过Swift编译器进行编译的)。因此,添加了final
属性,专门用于使clang强制继承objc_subclassing_restricted
Swift类的子类的非法性。
即使有可能,将Objective C类最终定为确实没有太大的好处。目标C是一种更具动态性的语言,似乎遵循Python的“我们都是成年人”的口号。
支持final
类的最大原因是告知编译器哪些类是去虚拟化的候选对象。但是,Objective C始终使用动态调度,而从不进行虚拟化。