为什么编译?
internal class A {
public func f() {
}
}
Run Code Online (Sandbox Code Playgroud)
我希望f的"公共"修饰符不被允许,因为它的封闭类是内部的.
在SE-0025中提到允许这种情况的一个动机:Scoped Access Level(强调我的):
在具有更严格访问权限
internal的private类型(例如类型内)中使用更广泛的访问控制级别时,编译器不应发出警告.这允许该类型的所有者设计他们将使用的访问权限,以便更广泛地访问该类型.(成员仍然无法在封闭的词法范围之外访问,因为类型本身仍然受到限制,即外部代码永远不会遇到该类型的值.)
因此,虽然它不会改变成员的可访问性,但如果封闭类型具有更广泛的访问级别,它允许开发人员传达他们认为给定成员应具有的访问级别 - 例如,这可能对当前具有的API有用.internal计划public在将来的版本中制作的类型.
Swift 参考文献在访问级别指导原则下说,
任何实体都不能根据具有较低(更严格)访问级别的另一个实体来定义。
因此,我认为这并不意味着不能根据具有更高访问级别的另一个实体来定义一个实体。事实上,这肯定是必要的。