Swift 中的访问控制有哪些级别?open、public、internal、fileprivate、private 有什么区别?
Swift 提供了五个访问控制级别,用于控制代码实体(类型、属性、方法等)的可见性和可访问性。这些访问级别帮助开发者实现封装和信息隐藏。
访问控制级别:
-
open:
- 最高级别的访问权限
- 可以在定义模块的任何地方访问
- 可以在其他模块中访问和继承
- 可以在其他模块中被重写
- 主要用于类和类成员
- 示例:
swift
open class OpenClass { open var openProperty: Int = 0 open func openMethod() {} }
-
public:
- 可以在定义模块的任何地方访问
- 可以在其他模块中访问
- 但不能在其他模块中继承或重写
- 适用于不希望被继承或重写的公共 API
- 示例:
swift
public class PublicClass { public var publicProperty: Int = 0 public func publicMethod() {} }
-
internal(默认):
- 可以在定义模块的任何地方访问
- 不能在其他模块中访问
- 这是默认的访问级别
- 适用于模块内部的实现细节
- 示例:
swift
class InternalClass { // 默认为 internal var internalProperty: Int = 0 func internalMethod() {} }
-
fileprivate:
- 只能在定义的文件中访问
- 不能在同一个模块的其他文件中访问
- 适用于文件内部的辅助类型和函数
- 示例:
swift
class FilePrivateClass { fileprivate var filePrivateProperty: Int = 0 fileprivate func filePrivateMethod() {} }
-
private:
- 最低级别的访问权限
- 只能在定义的作用域中访问
- 不能在同一个文件的其他类型中访问
- 适用于类型内部的实现细节
- 示例:
swift
class PrivateClass { private var privateProperty: Int = 0 private func privateMethod() {} func publicMethod() { privateMethod() // 可以访问 } }
访问控制规则:
-
实体不能比其类型更公开:
swiftpublic class PublicClass { private var property: Int = 0 // 正确 // public var property: Int = 0 // 错误 } -
元组类型的访问级别是所有成员中最严格的:
swiftprivate var tuple: (Int, String) = (1, "hello") // private -
函数的访问级别是所有参数和返回值类型中最严格的:
swiftprivate func process(_ data: InternalType) -> PublicType { // 函数访问级别为 private } -
嵌套类型的访问级别:
swiftpublic class OuterClass { private class InnerClass { // InnerClass 的访问级别为 private } }
最佳实践:
- 默认使用 internal,只在需要时使用其他级别
- 使用 private 限制实现细节
- 使用 fileprivate 处理文件内部的辅助功能
- 使用 public 定义公共 API
- 使用 open 定义需要被继承和重写的公共 API
- 遵循最小权限原则,只暴露必要的接口