我正在我的代码(https://github.com/philackm/ScrollableGraphView)中实现ScrollableGraphView库并遇到以下问题:
要确认ScrollableGraphViewDataSource,我添加
func value(forPlot plot: Plot, atIndex pointIndex: Int) -> Double
到我的代码,Xcode在“plot.identifier”中给出以下错误:
'identifier' is inaccessible due to 'internal' protection level.
任何人都可以帮助发生什么事吗?
import UIKit
import ScrollableGraphView
class ViewController: UIViewController, ScrollableGraphViewDataSource {
// Class members and init...
var linePlotData: [Double] = [1, 2, 3, 4, 5]// data for line plot
var barPlotData: [Double] = [1, 2, 3, 4, 5]// data for bar plot
var xAxisLabels: [String] = ["Jan", "Feb", "Mar", "Apr", "May"]// the labels along the x axis
var numberOfPointsInGraph = 5
override func viewDidLoad() {
super.viewDidLoad()
let graph = ScrollableGraphView(frame: self.view.frame, dataSource: self)
// Graph Configuration
// ###################
graph.backgroundColor = UIColor.white
graph.shouldAnimateOnStartup = true
// Reference Lines
// ###############
let referenceLines = ReferenceLines()
referenceLines.positionType = .relative
referenceLines.relativePositions = [0, 0.5, 0.8, 0.9, 1]
graph.addReferenceLines(referenceLines: referenceLines)
// Adding Plots
// ############
let linePlot = LinePlot(identifier: "linePlot")
linePlot.lineWidth = 5
linePlot.lineColor = UIColor.black
let barPlot = BarPlot(identifier: "barPlot")
barPlot.barWidth = 20
barPlot.barLineColor = UIColor.gray
graph.addPlot(plot: linePlot)
graph.addPlot(plot: barPlot)
self.view.addSubview(graph)
}
// Implementation for ScrollableGraphViewDataSource protocol
func value(forPlot plot: Plot, atIndex pointIndex: Int) -> Double {
switch (plot.identifier) {
case "linePlot":
return linePlotData[pointIndex]
break
case "barPlot":
return barPlotData[pointIndex]
break
}
}
func label(atIndex pointIndex: Int) -> String {
return xAxisLabels[pointIndex]
}
func numberOfPoints() -> Int {
return numberOfPointsInGraph
}
}
答案 0 :(得分:3)
identifier
类的Plot
属性没有明确的访问级别,因此它接收默认的访问级别" internal"。可以通过定义模块中的代码访问内部属性,但不能从另一个模块中的代码访问内部属性。
您的代码不在定义模块中,因此无法访问内部identifier
属性。
该框架的作者可能应该提供只读的公共identifier
属性。
正如您所做的那样,在回购提交上提交问题是一种合理的方法。
您可以通过分配repo并明确地将identifier
更改为public var identifier:String!
来解决此问题,尽管这有点像黑客攻击。
identifier
应该是public let identifier:String
,并且具有子类调用的适当的初始化程序。看起来作者希望Plot
成为一个"抽象"通过不提供初始化程序来进行分类,但是它们必须使用隐式展开的identifier
变量。我认为内部init(identifier:)
函数更可取