【问题标题】:access control on protocol implementation init协议实现初始化的访问控制
【发布时间】:2017-06-28 18:00:07
【问题描述】:

试图对将由单例类实现的协议实施访问控制。 我希望班级有一个 fileprivate init,有没有办法强制执行这种行为? 由于协议不是一个类,我不能将 init 放在协议扩展中。

【问题讨论】:

  • 你不能。您不能使用协议来强制类限制对某些内容的访问,因为协议要求的所有实现都需要与协议本身一样可访问。如果协议是internal,那么其要求的所有实现都需要是internal
  • 除此之外...根据您下面的 cmets,您想要这样做的原因似乎是确保实现协议的类是单例。但是,即使您可以使用协议来限制初始化程序的访问控制级别,这也不会阻止类具有更易于访问的 不同 初始化程序。仅仅拥有fileprivate 初始化器并不能确保该类是单例;它必须是类的唯一初始化器。
  • 我知道这一点,这就是为什么我想也许子类化可以让我这样做,但在父类中使用 init 似乎是不可能的。

标签: swift singleton protocols


【解决方案1】:

根据 Apple 文档:

协议定义中每个需求的访问级别会自动设置为与协议相同的访问级别。您不能将协议要求设置为与其支持的协议不同的访问级别。这确保了协议的所有要求在采用该协议的任何类型上都是可见的。

链接Protocol docs

编辑:我有点误读了这个问题。

如果我理解 OP 的说明,那么我目前知道的确保类是单例的唯一方法是将其 init 方法标记为私有或文件私有。

对于我只有静态方法的简单单例,我有这个:

private init() {

}

【讨论】:

  • 不是我问队友对不起
  • @thibautnoah 你可以声明 init fileprivate。如果我又弄错了,请澄清您所说的强制执行的确切含义。
  • 未来的我可能会傻到不看我为我的框架编写的文档。我想确保将来我不会忘记将初始化标记为私有或已经有一个私有初始化。我正在考虑子类化+协议,但不确定它是否能让我做我想做的事
  • @thibautnoah 好吧,就像我在回答中写的那样,不幸的是,您不能在协议中这样做。我认为,如果您在单例类中将指定的初始化程序标记为私有,您将无法创建该类的其他实例,因此它应该就足够了。
  • 好像你不明白,我已经做到了,可能有办法解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多