Swift 协议中的公共默认初始化

Swift 协议中的公共默认初始化,swift,protocols,Swift,Protocols,我有以下代码: public protocol MyProtocol { init() } public extension MyProtocol { public init() { self.init() } } public final class MyClass: MyProtocol {} 我的错误是: 初始值设定项“init()”必须声明为public,因为它与 公共协议“MyProtocol”中的要求 如果我在final之前删除访问控制(

我有以下代码:

public protocol MyProtocol {
    init()
}

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

public final class MyClass: MyProtocol {}
我的错误是:

初始值设定项“init()”必须声明为public,因为它与 公共协议“MyProtocol”中的要求

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

更奇怪的是,默认情况下,只能在
扩展中找到的另一个
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
。为什么不是这样?

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

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

由于
MyClass
”默认初始值设定项是内部的,因此如果在类中未声明公共init,而
MyClass
是公共的,则协议不符合协议