モジュール内でinternalを使用しているクラスをカスタマイズしたい
Charts
というフレームワークを使っています。Cocoapodsでインストールしました。
この中でRadarChartView
の表示を変えたいと思います。そのためにはRadarChartRenderer
を変更する必要があります。
RadarChartView
の中では
internal override func initialize()
{
super.initialize()
_yAxis = YAxis(position: .left)
renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)
_yAxisRenderer = YAxisRendererRadarChart(viewPortHandler: _viewPortHandler, yAxis: _yAxis, chart: self)
_xAxisRenderer = XAxisRendererRadarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, chart: self)
self.highlighter = RadarHighlighter(chart: self)
}
のrenderer
がRadarChartRenderer
のインスタンスです。まずinitialize
がinternal指定なのでこれをオーバーライドすることはできません。renderer
は
open class ChartViewBase: NSUIView, ChartDataProvider, AnimatorDelegate
{
...
/// object responsible for rendering the data
open var renderer: DataRenderer?
...
}
ですのでopenですからカスタムのrendererに置き換えることはできそうです。ただし
renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)
で使われる_animator
や_viewPortHandler
がinternalですので必要なパラメータをRadarChartView
のサブクラスやextensionで与えることはできません。
このような疑問は私だけでなく多くの人が持っているようで
- Module is not extensible
- ChartUtils methods are marked internal and cannot be use to create custom charts
ほか色々あります。2015年のプルリクエストなのでこれが採用される見込みはないのかも知れません。
何か上手いアイディアがあればお知恵を拝借したいと思います。よろしくお願いします。
現在はモジュールを直接書き換えるという乱暴な方法を取っています。
追記(2017年2月7日)
具体的に何をしたいか書かなかったためわかりにくかったかも知れません。
レーダーチャートで一番凹んでいるところに「!」を付与してほしいと上司から頼まれました。例えば試験の成績をレーダーチャートで表して、英語が一番点が低かったらそこに「!」を表示します。
そのためにはRadarChartRenderer
を変更するしかなく、カスタムのRadarChartRenderer
を使うにはRadarChartView
のrendererも変更しないといけないのです。
Chartsライブラリはクラス全体はopenになっているものの、internal指定も多く実質的にカスタマイズが難しい構造になっています。