swift - 为什么具有协议(protocol)一致性的扩展不能具有特定的访问级别?

标签 swift protocols swift-extensions access-levels

假设我们有以下示例代码:

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)声明设置为 publicprivate 也不会消除错误。

问题

如果扩展符合协议(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,除非该类型本身具有较低的访问级别。所以在你的情况下,如果 MyClassMyProtocol 都是 public,你可能会得到一个编译器错误,告诉你 someFunction( ) 也需要标记为 public。但是因为它看起来像 MyProtocol 实际上是 internal,省略任何访问修饰符作为 someFunction() 默认为 internal.

关于swift - 为什么具有协议(protocol)一致性的扩展不能具有特定的访问级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45925550/

相关文章:

Swift:类型不符合协议(protocol) 'BooleanType.Protocol'

ios - 未调用 Swift 协议(protocol)扩展

python - Numba 签名协议(protocol)

ios - 带有 Swift 5.0 编译器的 Xcode 10.2 - 协议(protocol)继承问题

ios - 使用扩展创建可点击的 UIImageView

ios - 依次执行Dispatch main

swift - 使用核心数据查找重复条目

swift - 协议(protocol)关联类型类型别名分配编译错误

ios - 协议(protocol)实现协议(protocol)的默认实现

swift - 如何制作通用的序列过滤器包装器?过滤器包含 Set 和 Array 类型的相同 block