Swift Academy · 课时

宏角色:独立宏与附加宏

了解 #expression 宏,以及 @attached peer/member/accessor 宏角色。

第 1 / 4 课13 个步骤

宏角色:独立宏与附加宏 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

什么是 Swift 宏

Swift 宏会在编译时展开源代码,自动生成样板代码,而且不会产生运行时开销。

// Macros are invoked with # (freestanding) or @ (attached)
#warning("Fix this later")
@Observable class Counter { var count = 0 }

独立表达式宏

独立表达式宏以#开头,可以生成一个值或执行副作用。

// #stringify expands to a tuple of the value and its source string
let (val, src) = #stringify(1 + 2)
print(val, src) // 3, "1 + 2"

独立声明宏

独立声明宏会在使用位置生成新的声明,例如函数和变量。

// #makePair emits two variables
#makePair("point", x: 1, y: 2)
// expands to: let pointX = 1; let pointY = 2

附加成员宏

附加的@member宏可以为其所附加的类型添加新的存储属性、计算属性、初始化器或方法。

@AddID
struct User { var name: String }
// Expands to: var id = UUID()

附加访问器宏

附加的@accessor宏会为存储属性生成获取器和设置器实现。

struct Point {
  @Clamped(0...100)
  var x: Int = 0
  // accessor macro generates get/set with clamping
}

附加同级宏

同级宏会在其所附加的声明旁边添加同级声明。

class Service {
  @AddAsync
  func fetchSync(completion: @escaping (Data)->Void) { ... }
  // peer macro adds: func fetch() async -> Data
}

附加一致性宏

一致性宏会为类型添加协议遵循及其所需的实现。

@EquatableByID
struct Product { var id: Int; var name: String }
// adds: extension Product: Equatable { ... }

附加扩展宏

扩展宏会为类型生成完整的扩展代码块,适合用于添加复杂的协议实现。

@CustomCodable
struct Config { var host: String; var port: Int }
// adds: extension Config: Codable { custom encode/decode }

宏展开发生在编译时

所有宏展开都发生在编译期间,不会产生运行时开销,并且展开后的代码可以在 Xcode 中查看。

// Right-click macro usage in Xcode → "Expand Macro"
// to see the generated source code

声明宏

宏应在单独的宏目标中使用@freestanding或@attached属性进行声明。

@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
  = #externalMacro(module: "MyMacros", type: "StringifyMacro")

宏角色概览

独立宏:#expression、#declaration。附加宏:@member、@accessor、@peer、@conformance、@extension。

// Freestanding
let result = #stringify(40 + 2)
// Attached
@Observable class Model { var count = 0 }

快速检查

哪个宏角色可以为其修饰的类型添加新成员,例如属性或初始化器?

课程回顾

独立宏(#name)可以生成值或声明。附加宏(@name)可以为类型添加成员、访问器、同级声明、协议遵循或扩展。所有展开都发生在编译时。

免费开始

用 AI 导师学习 Swift — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
122
课程
409

常见问题解答

「宏角色:独立宏与附加宏」课时是免费的吗?

是的 — 「宏角色:独立宏与附加宏」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「宏角色:独立宏与附加宏」这节课中我会学到什么?

了解 #expression 宏,以及 @attached peer/member/accessor 宏角色。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「宏角色:独立宏与附加宏」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 宏角色:独立宏与附加宏
  2. 编写独立表达式宏
  3. 用于减少样板代码的附加成员宏
  4. 测试与调试宏
← 返回 Swift Academy