Public 协议中的默认初始化
Public default init in protocol
我有这个代码:
public protocol MyProtocol {
init()
}
public extension MyProtocol {
public init() {
self.init()
}
}
public final class MyClass: MyProtocol {}
我收到一条错误消息:
Initializer 'init()' must be declared public because it matches a
requirement in public protocol 'MyProtocol'
如果我在 final
之前删除访问控制 (public
),它将起作用。但为什么?有什么办法可以让协议处理 init 吗?我认为默认情况下协议的所有成员都是隐式的 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
。为什么不是这样?
MyClass
应该符合给定协议 MyProtocol
,即使 MyClass
是 public。但是如果 MyClass
是 public 但它的 init 从另一个模块不可见,MyClass
将如何符合 MyProtocol
?它将符合 MyProtocol
(签名是这样说的)同时不符合(没有可见的初始化)。
Since your protocol can't be certain to cover all members of the class that uses it, any initializer you declare in your protocol will need to delegate initialization of the "unknown" members of the class to another initializer provided by the class itself.
由于 MyClass
' 默认初始化器是内部的,如果在 class 中没有声明 public init 而 MyClass
是 public.
我有这个代码:
public protocol MyProtocol {
init()
}
public extension MyProtocol {
public init() {
self.init()
}
}
public final class MyClass: MyProtocol {}
我收到一条错误消息:
Initializer 'init()' must be declared public because it matches a requirement in public protocol 'MyProtocol'
如果我在 final
之前删除访问控制 (public
),它将起作用。但为什么?有什么办法可以让协议处理 init 吗?我认为默认情况下协议的所有成员都是隐式的 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
。为什么不是这样?
MyClass
应该符合给定协议 MyProtocol
,即使 MyClass
是 public。但是如果 MyClass
是 public 但它的 init 从另一个模块不可见,MyClass
将如何符合 MyProtocol
?它将符合 MyProtocol
(签名是这样说的)同时不符合(没有可见的初始化)。
Since your protocol can't be certain to cover all members of the class that uses it, any initializer you declare in your protocol will need to delegate initialization of the "unknown" members of the class to another initializer provided by the class itself.
由于 MyClass
' 默认初始化器是内部的,如果在 class 中没有声明 public init 而 MyClass
是 public.