【问题标题】:Getting initializer is inaccessible due to 'internal' protection level由于“内部”保护级别,无法访问初始化程序
【发布时间】:2018-07-16 14:52:43
【问题描述】:

我知道这可能不是问这个特定问题的正确地方,但我已尝试联系下面 GitHub 存储库的作者,但到目前为止没有任何回复。

所以,我在 GitHub 上发现了 this 特别有用的库,它基本上允许在 tvOS 上创建一个或多个“选择器”。它带有一个方便的预制日期选择器,它使用 MultiPickerConfiguration 类来处理 UI 配置以及其他属性。

但是,在通过 Cocoapods 拉入库后,我似乎无法实例化我自己的 MultiPickerConfiguration 对象。我尝试通过 extension 创建一个新的初始化程序,但 Xcode 抱怨以下消息:

initializer is inaccessible due to 'internal' protection level

在这一点上我有点难过,我真的不想把整个.xcproj 拉到我的.xcworkspace 中。

有人有什么建议吗?谢谢!

【问题讨论】:

    标签: swift xcode datepicker tvos


    【解决方案1】:

    该结构需要一个公共的 init 方法。作者需要添加一个,或者您可以添加一个并将其作为拉取请求提交。

    考虑结构类型的默认成员初始化器 如果结构的任何存储属性是私有的,则为私有。 同样,如果结构的任何存储属性是文件 私有的,初始化器是文件私有的。否则,初始化器 具有内部访问级别。

    和上面的默认初始化器一样,如果你想要一个公共结构 使用时可使用成员初始化器初始化的类型 另一个模块,你必须提供一个公共的成员初始化器 将自己作为类型定义的一部分。

    https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html#ID21

    【讨论】:

    • 我想的差不多。但是,看到作者已经从事 MIA 有一段时间了,有什么方法可以让我通过扩展添加init,或者不涉及到库的基本代码?
    • 不。由于所有属性都是内部的,因此您无权访问它们来创建 init 方法。您可以分叉存储库并自己进行更改。
    • 这是我一直害怕的答案,但可能是唯一存在的答案。 :) 感谢您的帮助!
    【解决方案2】:

    其他人似乎有同样的问题并发布了这个issue

    看到最后一次提交是 2018 年 2 月,我怀疑有人会很快修复它。您可以提交拉取请求并等待有人合并它。

    同时,您可以通过编辑代码来添加公共初始化程序。在左侧面板中找到 pod 的代码:Pods > Pods > TVMultiPicker > MultiPickerConfiguration.swift。开始输入,会出现一个对话框,询问您是否要解锁文件。单击“解锁”并编写初始化程序。

    【讨论】:

    • 啊,实际上,是我发布了这个问题,哈哈。是的,我知道我可以修改下载的 pod 的基本代码,但作为一般经验法则,我尽量不这样做。不过感谢您的提示! :)
    猜你喜欢
    • 2018-08-25
    • 2017-04-13
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2017-12-23
    相关资源
    最近更新 更多