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

时间:2018-10-09 21:54:07

标签: objective-c swift subclass

我正在为我的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类进行子类化?

1 个答案:

答案 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始终使用动态调度,而从不进行虚拟化。