由于“内部”保护级别而无法访问
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 由于其保护级别而无法访问。只能处理公共类型