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

Swift中重写@objc父类方法为何出现冲突与无法识别问题?

Swift子类重写DGCharts方法的错误原因及解决办法

无override时的选择器冲突问题

Objective-C 没有 Swift 的 private 访问控制机制,只要方法标记了 @objc,就会被暴露给 Objective-C 运行时并生成对应的选择器。父类 BarLineChartViewBase 的 doubleTapGestureRecognized: 方法已经注册了选择器 doubleTapGestureRecognized:,子类中你声明的 private @objc 方法会生成完全相同的选择器,导致运行时无法区分两个方法,因此触发选择器冲突错误。

添加override后提示“未重写父类方法”的原因

这是两个核心因素共同导致的:

  • 访问权限不兼容:Swift 规定重写方法的访问权限不能比父类更严格。DGCharts 作为开源库,doubleTapGestureRecognized: 这类手势处理方法通常是 internal 或 public 权限,子类用 private 修饰重写方法违反了这一规则,编译器会将其判定为新方法而非重写。
  • 方法签名可能不匹配:你代码中使用的参数类型是 NSUITapGestureRecognizer,但 DGCharts 对应方法的参数大概率是 UITapGestureRecognizer(iOS 平台),参数类型不一致时,编译器会认为这是一个全新方法,而非对父类方法的重写。

正确的重写实现

移除 private 修饰符,确保方法签名与父类完全一致:

class Test: DGCharts.LineChartView {
    @objc override func doubleTapGestureRecognized(_ recognizer: UITapGestureRecognizer) {
        // 编写你的重写逻辑
        // 若需要保留父类原有行为,可调用:super.doubleTapGestureRecognized(recognizer)
    }
}

如果是 macOS 平台,请确认父类方法的参数类型(如 NSClickGestureRecognizer),保证参数类型完全匹配即可。

内容的提问来源于stack exchange,提问作者cheersmate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:08:15