由于“内部”保护级别

时间:2017-07-09 13:34:27

标签: swift

我正在我的代码(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
}
}

1 个答案:

答案 0 :(得分:3)

identifier类的Plot属性没有明确的访问级别,因此它接收默认的访问级别" internal"。可以通过定义模块中的代码访问内部属性,但不能从另一个模块中的代码访问内部属性。

您的代码不在定义模块中,因此无法访问内部identifier属性。

该框架的作者可能应该提供只读的公共identifier属性。

正如您所做的那样,在回购提交上提交问题是一种合理的方法。

您可以通过分配repo并明确地将identifier更改为public var identifier:String!来解决此问题,尽管这有点像黑客攻击。

identifier应该是public let identifier:String,并且具有子类调用的适当的初始化程序。看起来作者希望Plot成为一个"抽象"通过不提供初始化程序来进行分类,但是它们必须使用隐式展开的identifier变量。我认为内部init(identifier:)函数更可取