编程iOS 架构师/库开发人员

Swift 中嵌套类型和成员的访问控制是如何工作的?在模块和库的组合中可能会出现哪些可访问性方面的细节问题?

用 Hintsage AI 助手通过面试

答案。

在 Swift 中,访问级别(privatefileprivateinternalpublicopen)不仅影响类、结构及其属性,还影响嵌套类型。嵌套类型默认继承其外部类型的访问级别,除非另行指定明显的限制。

主要细节:

  • 如果外部类型声明为 internal,嵌套类型不能比外部类型更开放,但可以更“封闭”(例如,外部类型为 public,嵌套类型为 private)。
  • 当在不同模块(框架)中编译时,声明为 internal 的嵌套类型将无法从其他模块访问。

示例:

public class A { public struct B { fileprivate func foo() {} } }

在这个示例中,AB 是公共的,但方法 foo() 是文件私有的。

陷阱问题。

问题:“嵌套类型可以具有比其外部类型更高的访问级别吗?”

**答案:**不,嵌套类型的访问级别不能高于其外部类型的访问级别。如果尝试声明一个具有更高访问级别的嵌套类型,编译器将抛出错误。

错误示例:

internal struct MyStruct { public enum MyEnum { ... } // 错误:public 不能在 internal 内部 }

由于对该主题细微差别的不理解而导致的实际错误示例。


故事 1

在一个通用框架中,嵌套结构的访问级别与外部类型未同步。在发布版本中,这导致无法在客户端应用程序中使用内部枚举,并需要紧急修改接口。


故事 2

在一个大型项目中,内部服务对象具有一个声明为 internal 的嵌套类。在出现依赖此类的新模块后,集成变得不可能,必须提升访问级别并完全重新编译 SDK。


故事 3

在一个复杂的库中,部分嵌套结构被声明为 public,而容器本身为 internal。在迁移到新版本时发生了严重错误:公共类型在外部上下文中未编译成功,导致多个团队的更新受阻。