乐闻世界logo
搜索文章和话题

Swift 中的访问控制有哪些级别?open、public、internal、fileprivate、private 有什么区别?

2月21日 15:06

Swift 中的访问控制有哪些级别?open、public、internal、fileprivate、private 有什么区别?

Swift 提供了五个访问控制级别,用于控制代码实体(类型、属性、方法等)的可见性和可访问性。这些访问级别帮助开发者实现封装和信息隐藏。

访问控制级别:

  1. open:

    • 最高级别的访问权限
    • 可以在定义模块的任何地方访问
    • 可以在其他模块中访问和继承
    • 可以在其他模块中被重写
    • 主要用于类和类成员
    • 示例:
      swift
      open class OpenClass { open var openProperty: Int = 0 open func openMethod() {} }
  2. public:

    • 可以在定义模块的任何地方访问
    • 可以在其他模块中访问
    • 但不能在其他模块中继承或重写
    • 适用于不希望被继承或重写的公共 API
    • 示例:
      swift
      public class PublicClass { public var publicProperty: Int = 0 public func publicMethod() {} }
  3. internal(默认):

    • 可以在定义模块的任何地方访问
    • 不能在其他模块中访问
    • 这是默认的访问级别
    • 适用于模块内部的实现细节
    • 示例:
      swift
      class InternalClass { // 默认为 internal var internalProperty: Int = 0 func internalMethod() {} }
  4. fileprivate:

    • 只能在定义的文件中访问
    • 不能在同一个模块的其他文件中访问
    • 适用于文件内部的辅助类型和函数
    • 示例:
      swift
      class FilePrivateClass { fileprivate var filePrivateProperty: Int = 0 fileprivate func filePrivateMethod() {} }
  5. private:

    • 最低级别的访问权限
    • 只能在定义的作用域中访问
    • 不能在同一个文件的其他类型中访问
    • 适用于类型内部的实现细节
    • 示例:
      swift
      class PrivateClass { private var privateProperty: Int = 0 private func privateMethod() {} func publicMethod() { privateMethod() // 可以访问 } }

访问控制规则:

  1. 实体不能比其类型更公开:

    swift
    public class PublicClass { private var property: Int = 0 // 正确 // public var property: Int = 0 // 错误 }
  2. 元组类型的访问级别是所有成员中最严格的:

    swift
    private var tuple: (Int, String) = (1, "hello") // private
  3. 函数的访问级别是所有参数和返回值类型中最严格的:

    swift
    private func process(_ data: InternalType) -> PublicType { // 函数访问级别为 private }
  4. 嵌套类型的访问级别:

    swift
    public class OuterClass { private class InnerClass { // InnerClass 的访问级别为 private } }

最佳实践:

  1. 默认使用 internal,只在需要时使用其他级别
  2. 使用 private 限制实现细节
  3. 使用 fileprivate 处理文件内部的辅助功能
  4. 使用 public 定义公共 API
  5. 使用 open 定义需要被继承和重写的公共 API
  6. 遵循最小权限原则,只暴露必要的接口
标签:Swift