使用选择器init的覆盖方法在Swift中具有不兼容的类型

时间:2015-08-05 05:55:45

标签: ios swift

我是Swift的新手,我正在尝试子类化如下:

public class CombinedChartRenderer: ChartDataRendererBase {

    private weak var _chart: CombinedChartView!

    public init(chart: CombinedChartView, animator: ChartAnimator, viewPortHandler: ChartViewPortHandler)
    {
        super.init(animator: animator, viewPortHandler: viewPortHandler)

        _chart = chart

        createRenderers()
    }
}

public class MyCombinedChartRenderer: CombinedChartRenderer {
    private weak var _chart: MyCombinedChartView!
    public override init(chart: MyCombinedChartView, animator: ChartAnimator, viewPortHandler: ChartViewPortHandler)
    {
        super.init(chart: chart, animator: animator, viewPortHandler: viewPortHandler)

        _chart = chart
    }
}

总是说

Overriding method with selector 'initWithChart:animator:viewPortHandler:' has incompatible type '(MyCombinedChartView, ChartAnimator, ChartViewPortHandler) -> MyCombinedChartRenderer'

我不确定它有什么问题。我看到其他代码可以通过提供更专业的子类来完成这样的初始化。

CombinedChartView就像:

public class CombinedChartView: BarLineChartViewBase
{
...
}

public class MyCombinedChartView: CombinedChartView
{
    // do some customization and override
}

1 个答案:

答案 0 :(得分:0)

只需更改一些变量名称,冲突并使用init删除该覆盖关键字;

public class CombinedChartRenderer: ChartDataRendererBase {

    private weak var _chart: CombinedChartView!

    public init(chart: CombinedChartView, animator: ChartAnimator, viewPortHandler: ChartViewPortHandler)
    {
        super.init(animator: animator, viewPortHandler: viewPortHandler)

        _chart = chart

        createRenderers()
    }
}

public class MyCombinedChartRenderer: CombinedChartRenderer {
    private weak var _myChart: MyCombinedChartView!
    public init(myChart: MyCombinedChartView, animator: ChartAnimator, viewPortHandler: ChartViewPortHandler)
    {
        super.init(chart: myChart, animator: animator, viewPortHandler: viewPortHandler)

        _myChart = myChart // This can be removed by marking baseclass instance '_chart' as public; 
    }
}