You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:41:15