防止在Swift中对Objective-C类进行子类化
我正在我的Objective-C类中添加Swift内部注释。我试图阻止我的类被子类化:防止在Swift中对Objective-C类进行子类化,objective-c,swift,subclass,Objective C,Swift,Subclass,我正在我的Objective-C类中添加Swift内部注释。我试图阻止我的类被子类化: __attribute__((objc_subclassing_restricted)) @interface CWTestFinalClass : NSObject @end 这符合目标C中的预期: // Generates Error, as expected @interface CWTestSubclass : CWTestFinalClass @end 然而,我仍然能够在Swift中创建子类 /
__attribute__((objc_subclassing_restricted))
@interface CWTestFinalClass : NSObject
@end
这符合目标C中的预期:
// Generates Error, as expected
@interface CWTestSubclass : CWTestFinalClass
@end
然而,我仍然能够在Swift中创建子类
// Should fail, but works without error
class TestSubclass: CWTestFinalClass {
}
问题:如何防止Objective-C类在Swift中被子类化?Objective C没有
final
关键字或类似的关键字。即使编译时属性或修饰符确实存在,也可以通过使用运行时API动态创建任何psuedofinal类的子类来忽略它
Swift编译器强制要求Swift可以阻止对final
类进行子类化的尝试,但这不会阻止Objective C这样做(它不是通过Swift编译器编译的)。因此,添加了objc\u subclassing\u restricted
属性,特别是为了使clang强制执行子类化final
Swift类的非法性
即使有可能,让Objective C课程成为最终课程也没有什么好处。Objective C是一种更具动态性的语言,它似乎遵循Python的“我们都是成年人”口号
支持
final
类的最大原因是通知编译器哪些类是反虚拟化的候选类。但是Objective C总是使用动态调度,而且从来不会去虚拟化。我很好奇,你为什么关心人们用什么语言对你的类进行子类化?@Alexander-我不关心哪种语言,但我需要确保它不能用Swift或Objective-C进行子类化。目前,它不能在Objective-C中子类化。我想在Swift.Ah中复制此功能。这在Objective C中通常不受支持,因此在lagnuage中没有final
关键字。即使有,您也可以使用运行时API动态创建子类。objc\u subclassing\u restricted
属性是在Swift成为一种东西时添加的,专门用于强制执行final
Swift类在目标C中保持final。但通常,目标C的约定是支持所有类的子类化。首先,使用final
对性能没有好处,因为目标C方法调用总是动态调度的。没有去虚拟化。@Alexander你应该补充这一点作为回答,我很困惑;我以为你不能从Objective-C代码中对Swift类进行子类化…@NicolasMiari哦,是的。这是另一个需要objc\u子类化\u restricted
的原因。