我有此代码:
public protocol MyProtocol {
init()
}
public extension MyProtocol {
public init() {
self.init()
}
}
public final class MyClass: MyProtocol {}
我收到一个错误消息:
初始化器'init()'必须声明为public,因为它与 公共协议“ MyProtocol”中的要求
如果我在public
之前删除访问控制(final
),它将起作用。但为什么?有什么办法可以让协议处理初始化?我认为默认情况下协议的所有成员都是隐式public
。
更奇怪的是,默认情况下,只能在init
中找到的另一个extension
是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() {}
}
如您所见,新的初始化实际上是public
。我希望我的常规init
也应该是public
。为什么不是这种情况?
答案 0 :(得分:1)
MyClass
是公开的, MyProtocol
也应符合给定的协议MyClass
。但是,如果MyClass
是公开的,但其初始化在其他模块中不可见,那么MyProtocol
将如何符合MyClass
?它将符合MyProtocol
(签名是这样),而不是(没有可见的init)。
由于不确定您的协议是否涵盖使用该协议的类的所有成员,因此您在协议中声明的任何初始化器都需要将类的“未知”成员的初始化委托给该类提供的另一个初始化器本身。
由于MyClass
’是默认的内部初始化程序,因此如果MyClass
是公共的,而没有在类中声明任何公共init,则该协议不符合该协议。