在 Swift 中,访问级别(private,fileprivate,internal,public,open)不仅影响类、结构及其属性,还影响嵌套类型。嵌套类型默认继承其外部类型的访问级别,除非另行指定明显的限制。
主要细节:
internal,嵌套类型不能比外部类型更开放,但可以更“封闭”(例如,外部类型为 public,嵌套类型为 private)。internal 的嵌套类型将无法从其他模块访问。示例:
public class A { public struct B { fileprivate func foo() {} } }
在这个示例中,A 和 B 是公共的,但方法 foo() 是文件私有的。
问题:“嵌套类型可以具有比其外部类型更高的访问级别吗?”
**答案:**不,嵌套类型的访问级别不能高于其外部类型的访问级别。如果尝试声明一个具有更高访问级别的嵌套类型,编译器将抛出错误。
错误示例:
internal struct MyStruct { public enum MyEnum { ... } // 错误:public 不能在 internal 内部 }
故事 1
在一个通用框架中,嵌套结构的访问级别与外部类型未同步。在发布版本中,这导致无法在客户端应用程序中使用内部枚举,并需要紧急修改接口。
故事 2
在一个大型项目中,内部服务对象具有一个声明为 internal 的嵌套类。在出现依赖此类的新模块后,集成变得不可能,必须提升访问级别并完全重新编译 SDK。
故事 3
在一个复杂的库中,部分嵌套结构被声明为 public,而容器本身为 internal。在迁移到新版本时发生了严重错误:公共类型在外部上下文中未编译成功,导致多个团队的更新受阻。