You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Swift Macro中抛出错误?是否有现成的DiagnosticMessage实现?

在Swift Macro中抛出错误:无需自定义DiagnosticMessage的方法

你不需要每次编写宏都自定义DiagnosticMessage实现,Swift生态提供了现成的类型和简化API来完成错误诊断:

1. 使用SimpleDiagnosticMessage(自定义诊断ID场景)

SwiftDiagnostics模块中内置了SimpleDiagnosticMessage,它是DiagnosticMessage协议的基础实现,可以直接传入消息内容、严重程度和诊断ID,无需手动编写结构体:

import SwiftDiagnostics

// 创建诊断消息
let errorMessage = SimpleDiagnosticMessage(
    message: "You must attach this macro to a class!",
    severity: .error,
    diagnosticID: MessageID(domain: "MyMacroDomain", id: "invalid-target-type")
)

// 抛出诊断
context.diagnose(Diagnostic(node: declaration, message: errorMessage))

2. 使用diagnose的简化重载(快速抛出场景)

MacroExpansionContext的diagnose方法提供了更简便的重载,直接传入字符串消息、严重程度和语法节点即可,内部会自动处理DiagnosticMessage的创建:

context.diagnose(
    "You must attach this macro to a class!",
    severity: .error,
    node: declaration
)

这种方式适合不需要自定义诊断ID的快速场景,诊断ID会使用默认的生成规则。

关于文档找不到的问题

你在Swift Package Index的SwiftSyntax文档中找不到DiagnosticMessage,是因为它属于**SwiftDiagnostics模块**,而非SwiftSyntax核心模块。使用前需要确保导入SwiftDiagnostics,并且查看文档时要切换到SwiftDiagnostics的页面。

内容的提问来源于stack exchange,提问作者Sweeper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:42:13