当前位置: 首页 > news >正文

HoRain云--Swift访问控制:5大级别详解

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

Swift 访问控制

访问级别概览

访问级别详解

1. open和 public

2. internal(默认级别)

3. fileprivate

4. private

访问控制规则

1. 单一实体原则

2. 默认构造器的访问级别

3. 结构体成员初始化

协议访问控制

1. 协议本身的访问控制

2. 协议要求的访问控制

3. 协议继承

扩展的访问控制

1. 扩展的默认访问级别

2. 为扩展指定访问级别

泛型访问控制

类型别名访问控制

嵌套类型访问控制

实用示例

示例1:封装实现细节

示例2:模块化设计

示例3:测试友好的设计

访问控制的最佳实践

注意事项


Swift 访问控制

Swift 的访问控制机制用于限制代码中实体(类、结构体、枚举、属性、方法、初始化器等)的访问级别,实现封装和信息隐藏。

访问级别概览

Swift 提供了5个不同的访问级别(从高到低):

访问级别

描述

适用场景

open

最高访问级别,可被任何源文件访问、继承、重写

框架的公共接口

public

可被任何源文件访问,但模块外不能继承和重写

模块的公共API

internal

默认级别,只能被同一模块内的源文件访问

模块内部实现

fileprivate

只能被当前源文件访问

同一文件内的工具函数

private

最低级别,只能在当前作用域及其扩展中访问

类/结构体内部细节

访问级别详解

1.openpublic

// 定义在框架中 public class PublicClass { public var publicProperty = 0 internal var internalProperty = 1 fileprivate var fileprivateProperty = 2 private var privateProperty = 3 public init() {} } // 只能在模块内继承 class SubPublicClass: PublicClass { override init() { super.init() print(publicProperty) // ✅ print(internalProperty) // ✅ // print(fileprivateProperty) // ❌ 错误 // print(privateProperty) // ❌ 错误 } } // 定义在框架中 open class OpenClass { public var publicProperty = 0 open var openProperty = 1 // 可重写 public init() {} } // 在另一个模块中 class SubOpenClass: OpenClass { // ✅ open允许跨模块继承 override init() { super.init() print(publicProperty) // ✅ print(openProperty) // ✅ } // 可以重写open属性和方法 override var openProperty: Int { get { return 10 } set {} } }

2.internal(默认级别)

// 不指定访问级别时默认为internal struct InternalStruct { // 隐式internal var property = 0 // 隐式internal func doSomething() { // 隐式internal print("内部方法") } } // 同一模块内的任何源文件都可以访问 let obj = InternalStruct() // ✅ obj.property = 10 // ✅ obj.doSomething() // ✅

3.fileprivate

// FileA.swift fileprivate class FilePrivateClass { fileprivate var fileprivateVar = 0 private var privateVar = 1 func test() { print(fileprivateVar) // ✅ print(privateVar) // ✅ } } // 同一文件内可访问 let instance = FilePrivateClass() // ✅ instance.fileprivateVar = 5 // ✅ // instance.privateVar = 10 // ❌ 错误 // FileB.swift // 不同文件无法访问 // let instance2 = FilePrivateClass() // ❌ 错误

4.private

class BankAccount { private var balance: Double = 0.0 private(set) var accountNumber: String // 公开获取,私有设置 init(accountNumber: String) { self.accountNumber = accountNumber } public func deposit(amount: Double) { balance += amount } public func withdraw(amount: Double) -> Bool { if balance >= amount { balance -= amount return true } return false } public func getBalance() -> Double { return balance } } let account = BankAccount(accountNumber: "12345") account.deposit(amount: 1000) print(account.accountNumber) // ✅ // account.accountNumber = "67890" // ❌ 错误 // print(account.balance) // ❌ 错误

访问控制规则

1. 单一实体原则

每个实体的访问级别不能高于其依赖实体的访问级别。

// 错误示例 private class PrivateClass {} // public var publicVar: PrivateClass? // ❌ 错误:使用private类型的public属性 // 正确示例 public class PublicClass {} private var privateVar: PublicClass? // ✅

2. 默认构造器的访问级别

默认构造器的访问级别与所属类型的访问级别相同,除非类型是public

public class PublicClass2 { var x: Int public init() { x = 0 } // 必须显式声明为public } internal class InternalClass { var x: Int // 默认init是internal }

3. 结构体成员初始化

结构体默认成员初始化器的访问级别受其成员属性访问级别的影响。

private struct PrivateStruct { var a: Int var b: Int // 默认成员构造器是private } internal struct InternalStruct2 { public var a: Int internal var b: Int // 默认成员构造器是internal }

协议访问控制

1. 协议本身的访问控制

public protocol PublicProtocol { var publicProperty: Int { get set } func publicMethod() } internal protocol InternalProtocol { var internalProperty: String { get } }

2. 协议要求的访问控制

public protocol Drawable { func draw() // 隐式public // 可以限制协议要求的访问级别 internal func internalDraw() }

3. 协议继承

public protocol RefinedProtocol: InternalProtocol { // 继承的协议不能比当前协议访问级别高 func additionalMethod() }

扩展的访问控制

1. 扩展的默认访问级别

public class SomeClass { private var secret = "secret" } extension SomeClass { // 扩展中的成员默认internal func internalMethod() { print(secret) // ✅ 可以访问原类型的private成员 } }

2. 为扩展指定访问级别

public extension SomeClass { // 显式指定为public public func publicMethod() { // 可以添加新功能 } } private extension SomeClass { // 只能在同一文件内访问 func privateMethod() { print(secret) // ✅ } }

泛型访问控制

// 泛型类型的访问级别 public struct Stack<Element> { private var items = [Element]() public mutating func push(_ item: Element) { items.append(item) } public mutating func pop() -> Element? { return items.popLast() } } // 泛型函数的访问级别 public func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA }

类型别名访问控制

// 类型别名的访问级别可以低于或等于原类型 private class PrivateClass2 {} typealias Alias = PrivateClass2 // ✅ 可以更严格 public class PublicClass3 {} // typealias PrivateAlias = PublicClass3 // ❌ 不能更严格

嵌套类型访问控制

public class OuterClass { public class NestedPublicClass { public func publicMethod() {} } internal class NestedInternalClass { func internalMethod() {} } private class NestedPrivateClass { private func privateMethod() {} } } let nested = OuterClass.NestedPublicClass() // ✅ // let privateNested = OuterClass.NestedPrivateClass() // ❌

实用示例

示例1:封装实现细节

public struct Temperature { private var celsius: Double public var fahrenheit: Double { get { return celsius * 9/5 + 32 } set { celsius = (newValue - 32) * 5/9 } } public var kelvin: Double { get { return celsius + 273.15 } set { celsius = newValue - 273.15 } } public init(celsius: Double) { self.celsius = celsius } public init(fahrenheit: Double) { celsius = (fahrenheit - 32) * 5/9 } } let temp = Temperature(celsius: 0) print(temp.fahrenheit) // 32.0 // temp.celsius = 10 // ❌ 错误:celsius是私有的

示例2:模块化设计

// NetworkModule public protocol NetworkService { func fetchData(from url: String) -> Data } internal class NetworkServiceImpl: NetworkService { internal init() {} public func fetchData(from url: String) -> Data { // 实现网络请求 return Data() } } // 工厂方法 public class NetworkServiceFactory { public static func makeService() -> NetworkService { return NetworkServiceImpl() // 内部实现,外部只知道协议 } } // 客户端代码 let service = NetworkServiceFactory.makeService() // 类型是NetworkService let data = service.fetchData(from: "https://api.example.com")

示例3:测试友好的设计

public class DataProcessor { private let data: [Int] public init(data: [Int]) { self.data = data } public func process() -> Int { return data.reduce(0, +) } // 为测试提供的内部方法 internal func validateData() -> Bool { return !data.isEmpty && data.allSatisfy { $0 >= 0 } } } // 单元测试中 import XCTest @testable import MyModule // 使用@testable可以访问internal成员 class DataProcessorTests: XCTestCase { func testDataValidation() { let processor = DataProcessor(data: [1, 2, 3]) XCTAssertTrue(processor.validateData()) // ✅ 可以访问internal方法 } }

访问控制的最佳实践

  1. 最小化暴露原则

  2. 协议导向编程

  3. 测试友好设计

  4. 框架设计

  5. 模块化设计

注意事项

  1. 枚举

    public enum CompassPoint { case north, south, east, west // 枚举成员的访问级别自动与枚举相同 }
  2. Getter 和 Setter

    public struct TrackedString { public private(set) var numberOfEdits = 0 public var value: String = "" { didSet { numberOfEdits += 1 } } public init() {} } var string = TrackedString() string.value = "Hello" print(string.numberOfEdits) // 1 // string.numberOfEdits = 0 // ❌ 错误:setter是private
  3. 子类

Swift 的访问控制机制提供了强大的封装能力,帮助开发者构建模块化、可维护、安全的代码。合理使用访问控制可以提高代码质量,减少错误,并支持更好的团队协作。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

http://www.jsqmd.com/news/634417/

相关文章:

  • iTorrent:iPhone种子下载的终极解决方案 - 如何在iOS上轻松管理BitTorrent文件
  • EtchDroid:让安卓手机成为你的随身启动盘制作工具,无需Root权限
  • 打破硬件壁垒:普通电脑也能畅玩专业级AI绘画
  • 革命性多模态深度学习框架:CMU-Multimodal SDK终极解决方案
  • 【Redis】Redisson的可重入锁原理
  • 睿尔曼AGV复合机器人实战:Python Socket通信与底盘控制全解析
  • Hive 3.1.3 企业级部署与多模式配置实战
  • 从零开始掌握Robotics Toolbox:安装指南与核心功能解析
  • OrCAD不同版本兼容性踩坑记:为什么17.4报SPCODD-385,而16.6就没事?
  • Pyinstaller打包实战:一劳永逸解决资源文件路径难题
  • 【精】NPS内网穿透实战:从零搭建到高效管理
  • Kandinsky-5.0-I2V-Lite-5s应用场景:电商主图变视频、社交动态制作实战
  • 当AI医生遇上‘医学圣经’:我们如何用神经符号系统,让肺炎诊断准确率提升12%?
  • 避坑指南:UDS多帧诊断中FC.Wait帧触发的7个典型故障(含N_WFTmax配置建议)
  • 告别布线烦恼:基于涂鸦模组与墨水屏的无线座位状态管理器硬件选型与功耗优化实录
  • Unlock Music音乐解锁工具:打破音乐平台枷锁的终极解决方案
  • VASTBASE G100 Docker部署避坑指南:从零到生产环境的完整流程
  • Python敏感性分析的完整指南:SALib库的终极应用
  • HoRain云--Swift下标脚本:高效数据访问的艺术
  • 如何在Windows上快速安装Coolapk Lite:3步告别模拟器访问酷安社区
  • 厦门数据安全企业排名
  • 鸿蒙三方库适配HPKCHECK 文件执行流程详解
  • APK Installer:Windows原生环境下的安卓应用部署架构与技术实现
  • WVP-PRO流媒体服务器实战:如何优雅地自动清理无人观看的国标/代理流?
  • 脆性器件简介
  • AntiMicroX游戏手柄映射终极手册:让PC游戏完美适配你的手柄
  • 深度学习基于YOLOV11罂粟识别检测系统 YOLOV11框架如何训练无人机罂粟识别检测数据集 航拍罂粟数据集的训练及应用
  • 从零开始:在Autodl云服务器上搭建Neo4j知识图谱数据库的完整指南
  • 玩客云刷机实战:从零打造Armbian轻量级服务器(超详细图文指南)
  • Solaar实战指南:Linux下Logitech设备高效管理全攻略