由于“内部”保护级别而无法访问

Posted

技术标签:

【中文标题】由于“内部”保护级别而无法访问【英文标题】:inaccessible due to 'internal' protection level 【发布时间】:2017-07-09 13:34:27 【问题描述】:

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

Plot 类的identifier 属性没有显式访问级别,因此它接收默认访问级别“内部”。内部属性可以从定义模块中的代码访问,但不能从另一个模块中的代码访问。

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

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

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

您可以通过分叉存储库并将identifier 显式更改为public var identifier:String! 来解决此问题,尽管这有点小技巧。

identifier 实际上应该是public let identifier:String,并带有子类调用的适当初始化程序。看起来作者打算通过不提供初始化程序将Plot 成为一个“抽象”类,但是他们必须使用隐式展开的identifier 变量。在我看来,内部init(identifier:) 函数会更好

【讨论】:

以上是关于由于“内部”保护级别而无法访问的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到“由于保护级别而无法访问”错误?

ConfigurationProperty 由于其保护级别而无法访问

c# 资源中的 SmtpClient 由于其保护级别而无法访问

未序列化的结构列表列表。 System.RuntimeType 由于其保护级别而无法访问。只能处理公共类型

intellisense 无法找出 Visual Studio 和 C# 中的“内部”可访问性级别语法错误

由于可可豆荚中的内部保护错误快速类功能而无法访问