【问题标题】:Public default init in protocol协议中的公共默认初始化
【发布时间】:2018-08-02 21:28:56
【问题描述】:

我有这个代码:

public protocol MyProtocol {
    init()
}

public extension MyProtocol {
    public init() {
        self.init()
    }
}

public final class MyClass: MyProtocol {}

我收到一条错误消息:

Initializer 'init()' 必须声明为 public,因为它匹配一个 公共协议“MyProtocol”中的要求

如果我在 final 之前删除访问控制 (public),它会起作用。但为什么?有什么办法可以让协议处理初始化?我认为协议的所有成员默认都是隐式public

更奇怪的是,另一个只能在extension中找到的init默认是public

public protocol MyProtocol {
    init()
}

public extension MyProtocol {
    public init() {
        self.init()
    }

    public init(youDoNotHaveToImplementMe: Any) {
        self.init()
    }
}

public final class MyClass: MyProtocol {
    public init() {}
}

如你所见,新的 init 实际上是public。我预计我的正常init 也应该是public。为什么不是这样?

【问题讨论】:

    标签: swift protocols


    【解决方案1】:

    MyClass 应该符合给定的协议MyProtocol,即使MyClass 是公共的。但是,如果MyClass 是公共的但它的 init 从其他模块不可见,MyClass 将如何符合 MyProtocol?它将符合MyProtocol(签名这样说),同时不符合(没有可见的初始化)。

    由于您的协议不能确定覆盖使用它的类的所有成员,因此您在协议中声明的任何初始化程序都需要将类的“未知”成员的初始化委托给该类提供的另一个初始化程序自己。

    Source

    由于MyClass‘默认初始化程序是内部的,如果在MyClass 是公共的而没有在类中声明公共初始化,则协议不符合协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多