Swift 4.2升级问题:扩展中重写非@objc声明不支持的解决求助
解决Swift 4.2中“Overriding non-@objc declarations from extensions is not supported”报错
我之前升级Swift到4.x版本时也踩过这个一模一样的坑,给你分享下最直接的解决办法和背后的原因!
首先,这个报错是Swift 4+引入的严格规则导致的:Swift不允许在extension中重写非@objc标记的类成员——哪怕你给extension里的属性加了@objc和dynamic修饰也没用,因为你要重写的父类nib属性本身并没有标记@objc,这些修饰无法改变“重写非@objc声明”这个核心问题。
最稳妥的解决方案:把重写逻辑移到类的主定义中
你完全不需要用extension来重写这个类属性,直接把它放到MyHelpTableViewCell的主类体里即可,修改后的代码如下:
class MyHelpTableViewCell: WMHelpTableViewCell { override class var nib: UINib { return UINib(nibName: "MyHelpTableViewCell", bundle: nil) } }
为什么之前的写法行不通?
- Swift从4.0版本开始,就明确禁止在extension中重写类的原有成员(@objc方法的情况除外,但类属性的限制更严格)。这是官方为了避免语义歧义做出的调整——extension的设计初衷是扩展类的功能,而不是修改类的核心继承行为。
- 你添加的
@objc dynamic只是让当前属性暴露给OC runtime,但父类的nib属性并没有@objc标记,所以你本质上还是在尝试重写一个非@objc的声明,自然会触发报错。
如果父类WMHelpTableViewCell的nib属性是你有权限修改的,也可以给父类的这个属性加上@objc标记,但如果父类是第三方库或者不可修改的代码,那把重写逻辑移到主类定义里就是最省心的方案。
内容的提问来源于stack exchange,提问作者Pyae Phyoe Shein
相关产品推荐
相关产品推荐

