Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止在Swift中对Objective-C类进行子类化_Objective C_Swift_Subclass - Fatal编程技术网

防止在Swift中对Objective-C类进行子类化

防止在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中创建子类 /

我正在我的Objective-C类中添加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
的原因。