将Swift类设为Final是一种常见的做法,除非继承是绝对必要的,否则会鼓励使用组合。SWIFT通过设置Objective-C属性objc_subclassing_restricted来强制执行此操作,而不考虑导入到Objective-C时的final关键字。然而,具有这些属性的接口并没有像我预期的那样作为final类导入到SWIFT中。
objc_subclassing_restricted
final
如何创建从Objective-C final导入的SWIFT类?
w6lpcovy1#
而是鼓励使用构图。
这不是final的主要目标。最终类受益于编译时优化--由于编译器知道类是最终类,因此不会覆盖任何方法,因此它可以跳过vtable查找,直接转到这些方法的二进制位置。
作为一种语言,Objective-C不支持最终类,所以除非该语言发展到包含这样的类,否则在SWIFT端支持它是没有意义的。
对于您看到的objc_subclassing_restricted,该属性的目标不是使Swift类成为最终类,而是防止它被Objective-C代码子类化。关于属性here有一个很好的讨论,引用了一句相关的话:您不能将SWIFT类划分为子类(即使它是NSObject的子类并且可用于Objective-C运行时),因为OBJ-C中故意设置了限制,以阻止在OBJ-C代码中划分SWIFT类的子类。
1条答案
按热度按时间w6lpcovy1#
而是鼓励使用构图。
这不是
final
的主要目标。最终类受益于编译时优化--由于编译器知道类是最终类,因此不会覆盖任何方法,因此它可以跳过vtable查找,直接转到这些方法的二进制位置。作为一种语言,Objective-C不支持最终类,所以除非该语言发展到包含这样的类,否则在SWIFT端支持它是没有意义的。
对于您看到的
objc_subclassing_restricted
,该属性的目标不是使Swift类成为最终类,而是防止它被Objective-C代码子类化。关于属性here有一个很好的讨论,引用了一句相关的话:您不能将SWIFT类划分为子类(即使它是NSObject的子类并且可用于Objective-C运行时),因为OBJ-C中故意设置了限制,以阻止在OBJ-C代码中划分SWIFT类的子类。