微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

假设我们有以下示例代码
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

如果我将扩展标记为私有,则会发生同样的情况.无论访问级别设置为什么,似乎都无法设置符合协议的扩展的访问级别.即使将协议声明设置为public或private也不会删除错误.

如果Swift符合协议,Swift以这种方式限制扩展访问级别的原因是什么?如果在类级别应用协议一致性,则不存在此类限制.

如果我遵守编译器并删除私有/公共标识,someFunction()的访问级别是什么?

extension MyClass: MyProtocol {
    func someFunction() {
        print("hello")
    }
}

我想在这种情况下它将遵循原始的MyClass实现并公开但我不确定.

这种行为是否存在,因为扩展中的协议一致性意味着整个类符合协议,因此在扩展中重新指定访问级别是多余的?

这是因为除了协议本身的访问级别之外,不可能在任何访问级别上遵循协议.换句话说,如果您拥有公共协议,则不能与其私有一致.这部分是因为协议一致性是可以在运行时查询的东西(因此在你所在的模块之间不一致,或者在不同的文件/模块中实现两次),部分原因是因为如果一个模块只是很奇怪类型符合一个文件中的协议,并且在其他文件中使用时不符合该协议.

至于你对someFunction的访问级别的问题,它遵循与任何其他函数相同的规则.也就是说,除非类型本身具有较低的访问级别,否则它认为内部.因此,在您的情况下,如果MyClass和MyProtocol都是公共的,您可能会遇到编译器错误,告诉您someFunction()也需要标记为public.但是因为看起来MyProtocol实际上是内部的,所以省略任何访问修饰符就像someFunction()认为internal.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐