假设我们有以下示例代码:
protocol MyProtocol {
func someFunction()
}
public class MyClass {
}
public extension MyClass: MyProtocol {
func someFunction() {
print("hello")
}
}
编译上面的代码会出现以下错误:
Error: 'public' modifier cannot be used with extensions that declare protocol conformances
如果我将扩展标记为 private
,也会发生同样的事情。似乎您无法设置符合协议(protocol)的扩展的访问级别,无论访问级别设置为什么。即使将协议(protocol)声明设置为 public
或 private
也不会消除错误。
问题
如果扩展符合协议(protocol),Swift 以这种方式限制扩展的访问级别的原因是什么?如果在类级别应用协议(protocol)一致性,则没有这样的限制。
如果我服从编译器并删除 private
/public
指定,someFunction()
的访问级别是什么?
extension MyClass: MyProtocol {
func someFunction() {
print("hello")
}
}
我想在这种情况下它会遵循原始的 MyClass
实现并且是 public
但我不确定。
存在这种行为是因为扩展中的协议(protocol)一致性意味着整个类都符合协议(protocol),因此在扩展中重新指定访问级别是多余的吗?
最佳答案
这是因为除了协议(protocol)本身的访问级别之外,不可能在任何访问级别上遵守协议(protocol)。换句话说,如果你有一个 public
协议(protocol),你就不能让它符合 private
。这部分是因为协议(protocol)一致性是可以在运行时查询的东西(因此不能在你所在的模块之间有所不同,或者在不同的文件/模块中实现两次),部分是因为如果一个类型符合一个文件中的协议(protocol),但在其他文件中使用时不符合该协议(protocol)。
至于您关于 someFunction
访问级别的问题,它遵循与任何其他函数相同的规则。也就是说,它默认为 internal
,除非该类型本身具有较低的访问级别。所以在你的情况下,如果 MyClass
和 MyProtocol
都是 public
,你可能会得到一个编译器错误,告诉你 someFunction( )
也需要标记为 public
。但是因为它看起来像 MyProtocol
实际上是 internal
,省略任何访问修饰符作为 someFunction()
默认为 internal
.
关于swift - 为什么具有协议(protocol)一致性的扩展不能具有特定的访问级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45925550/