Swift 访问控制
封面图
•
2025-10-24
•
Swift
6
0
0
0
在 Swift 中,**访问控制(Access Control)** 是用于限制代码中某些部分的可见性和可访问性的机制。它有助于实现封装、数据隐藏和模块化编程。 Swift 提供了三种主要的访问级别(Access Levels): --- ## 一、访问级别分类 | 访问级别 | 说明 | |----------|------| | `public` | 可以被任何地方访问(包括其他模块)。 | | `internal` | 默认值,只能在定义它的模块内访问。 | | `file-private` | 只能在当前文件中访问。 | | `private` | 只能在定义它的类、结构体或枚举内部访问。 | > 注意:Swift 的访问级别是基于 **模块(module)** 和 **文件(file)** 来划分的。 --- ## 二、访问级别规则 ### 1. **默认访问级别** - 如果你没有显式地指定访问级别,默认是 `internal`。 - 在同一个模块(如同一个 Xcode 项目)中,所有内容默认都是 `internal`,可以互相访问。 ### 2. **模块间访问** - 要让某个类型或成员在其他模块中可访问,必须使用 `public` 或 `open`(对于类继承)。 ### 3. **文件级访问** - 使用 `fileprivate`,仅在当前文件中可见。 ### 4. **私有访问** - 使用 `private`,仅在定义它的类型(如类、结构体、枚举)内部可见。 --- ## 三、具体用法示例 ### 1. 类型(Class, Struct, Enum) ```swift public class PublicClass { internal var internalProperty = "Internal" fileprivate var filePrivateProperty = "File Private" private var privateProperty = "Private" } ``` ### 2. 方法和属性 ```swift class MyClass { public func publicMethod() { } internal func internalMethod() { } fileprivate func filePrivateMethod() { } private func privateMethod() { } } ``` ### 3. 枚举 ```swift enum MyEnum { case case1 fileprivate case filePrivateCase private case privateCase } ``` ### 4. 常量/变量 ```swift let globalConstant = "Global" // 默认是 internal fileprivate let filePrivateConstant = "File Private" private var privateVariable = 0 ``` --- ## 四、访问控制与继承 - `public` 和 `open` 是用于类继承的: - `open`:允许子类在其他模块中继承。 - `public`:允许子类在同一个模块中继承。 ```swift open class OpenClass { open func openMethod() { } } public class PublicClass { public func publicMethod() { } } ``` --- ## 五、访问控制与扩展(Extensions) - 扩展可以访问原始类型的所有成员,即使它们是 `private` 或 `fileprivate`。 ```swift class MyClass { private var secret = 42 } extension MyClass { func revealSecret() { print(secret) // 可以访问 private 属性 } } ``` --- ## 六、访问控制总结 | 级别 | 模块内 | 模块外 | 文件内 | 文件外 | |------|--------|--------|--------|--------| | `public` | ✅ | ✅ | ✅ | ✅ | | `internal` | ✅ | ❌ | ✅ | ❌ | | `fileprivate` | ✅ | ❌ | ✅ | ❌ | | `private` | ✅ | ❌ | ✅ | ❌ | --- 如果你有具体的场景(比如如何设置一个 API 为公开接口、如何保护类内部数据等),我可以进一步详细解释。需要吗?
上一篇:
Swift 泛型
标题录入,一次不能超过6条
返回顶部
留言
留言
评论