Shaula Blog

美丽的东西都是肤浅的

iOS 动态方法调用 - NSInvocation

iOS 动态方法调用 - NSInvocation NSInvocation 是 iOS/macOS 开发中 Objective-C 运行时的一个核心类,它用于封装并动态调用方法。该类允许将方法调用(包括目标对象、方法选择器、参数和返回值)存储为一个对象,从而实现延迟执行或跨上下文传递。

iOS UIAction

iOS UIAction 在上一篇文章我们介绍了如何使用 UIButtonConfiguration 对按钮的样式与状态进行管理,这篇文章介绍下可以同 UIButtonConfiguration 结合使用的一个类:UIAction. 什么是 UIAction? UIAction 是在 iOS 14 中引入的一个类,它封装了一个动作(action)以及该动作的相关属性(例如标题、图像、属性等)。你可以把它看作是一个将动作(闭包)和按钮的某些属性(如标题、图像)打包在一起的对象。它在 UIButton(configuration:primaryAction:) 初始化方法中作为参数,用于定义按钮的主要点击行为。

Swift RegexBuilder

Swift RegexBuilder 在 Swift 5.7 中,苹果引入了全新的 RegexBuilder 框架,彻底改变了开发者处理正则表达式的范式。告别晦涩难懂的正则符号,拥抱类型安全、模块化且可读性强的 DSL(领域特定语言),本文将带你探索 RegexBuilder 的强大能力。

Swift Actor隔离机制详解

Swift Actor隔离机制详解 在 Swift 中,Actor 的 actor-isolated 机制是用于确保并发安全的核心理念。以下是对你引用的那段话的分步解释: 1. Actor 的默认隔离规则 所有声明默认是 actor-isolated:当你在一个 Actor 类型内部声明属性或实例方法时,它们默认会被标记为 actor-isolated(即“隔离到该 Actor 实例”)。 目的:这种隔离保证了同一时间只能有一个任务(Task)访问这些属性和方法,从而避免数据竞争(Data Race)。 actor BankAccount { var balance: Double = 0.0 // actor-isolated 属性 func deposit(amount: Double) { // actor-isolated 方法 balance += amount } } 2. 同一 Actor 内部的自由访问 隔离环境内的自由调用:在 Actor 隔离的上下文(如 Actor 的方法内部)中,你可以直接访问同一 Actor 的其他 actor-isolated 声明,无需额外同步。 extension BankAccount { func withdraw(amount: Double) { // 可以直接访问 balance 和 deposit,因为它们在同一个隔离域 if balance >= amount { deposit(amount: -amount) // 无需 await } } } 3. 外部代码的异步访问 非隔离代码的访问限制:如果代码不在 Actor 的隔离环境中(例如普通函数、其他 Actor 的方法或非隔离方法),则必须通过 await 异步访问 actor-isolated 声明。 func externalTransfer(from account: BankAccount, to anotherAccount: BankAccount) async { // 必须用 await 调用 actor-isolated 方法 await account.deposit(amount: 100.0) // 必须用 await 读取 actor-isolated 属性 let balance = await account.balance } 4. 非隔离声明 (nonisolated) 的特殊性 标记为 nonisolated:若某个方法或属性不需要访问 Actor 内部状态,可以显式标记为 nonisolated。此时,它可以直接被同步调用,但内部无法访问其他 actor-isolated 成员。 extension BankAccount { nonisolated var accountID: String { // 不访问 balance 或其他隔离成员,可以是非隔离的 return "ACCT-12345" } nonisolated func logID() { print(accountID) // ✅ 允许:访问非隔离属性 // print(balance) ❌ 错误:无法访问 actor-isolated 属性 } } 5. 为什么需要这样设计? 数据竞争的预防:通过强制外部代码异步访问(排队等待 Actor 处理),确保同一时间只有一个任务修改 Actor 内部状态。 性能优化:Actor 内部的同步访问是高效的(无锁),而外部异步访问通过编译器检查保证安全。 总结表格 上下文 能否直接访问 actor-isolated 成员? 是否需要 await? 同一 Actor 的方法内部 ✅ 是 ❌ 否 外部代码 ❌ 否(需通过 Actor 引用) ✅ 是 nonisolated 方法 ❌ 否 ❌ 否(不能访问) 通过这种机制,Swift 的 Actor 在编译阶段就能检测出潜在的数据竞争,使得并发代码更安全且易于维护。

Swift 中的 Scanner 类

Swift 中的 Scanner 类 Scanner 是 Swift 标准库中一个用于解析结构化字符串的实用工具类。它能够逐步扫描字符串内容,并从中提取特定类型的数据(如整数、浮点数、子字符串等),特别适用于处理格式化文本数据或自定义协议解析。