协议中的公共默认初始化

时间:2018-08-02 21:28:56

标签: swift protocols

我有此代码:

public protocol MyProtocol {
    init()
}

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

public final class MyClass: MyProtocol {}

我收到一个错误消息:

  

初始化器'init()'必须声明为public,因为它与   公共协议“ MyProtocol”中的要求

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

更奇怪的是,默认情况下,只能在init中找到的另一个extensionpublic

public protocol MyProtocol {
    init()
}

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

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

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

如您所见,新的初始化实际上是public。我希望我的常规init也应该是public。为什么不是这种情况?

1 个答案:

答案 0 :(得分:1)

即使MyClass是公开的,

MyProtocol也应符合给定的协议MyClass。但是,如果MyClass是公开的,但其初始化在其他模块中不可见,那么MyProtocol将如何符合MyClass?它将符合MyProtocol(签名是这样),而不是(没有可见的init)。

  

由于不确定您的协议是否涵盖使用该协议的类的所有成员,因此您在协议中声明的任何初始化器都需要将类的“未知”成员的初始化委托给该类提供的另一个初始化器本身。

Source

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