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

Swift扩展宏编译报错:AutoDomainError未覆盖FormatableDomainError一致性

解决Swift宏报错:Conformance to 'FormatableDomainError' is not covered by macro 'AutoDomainError'

问题原因

你直接在宏生成的扩展中硬编码了协议一致性,但编译器无法识别该一致性是由@AutoDomainError宏负责提供的,因此抛出未覆盖的错误。Swift宏要求必须通过@attached的conformances参数明确声明宏将处理哪些协议的一致性,让编译器建立关联。

解决方案

1. 修改宏定义,添加conformances参数

在宏的声明中,明确指定该宏将为目标类型添加FormatableDomainError协议的一致性:

@attached(extension, conformances: FormatableDomainError, names: arbitrary)
public macro AutoDomainError() = #externalMacro(module: "YourMacroModuleName", type: "AutoDomainErrorMacro")

2. 调整宏实现,利用conformingTo参数生成扩展

不再硬编码协议名称,而是使用宏扩展方法传入的conformingTo参数(对应宏定义中声明的协议)来生成扩展,确保编译器能正确关联一致性:

public struct AutoDomainErrorMacro: ExtensionMacro {
    public static func expansion(
        of node: SwiftSyntax.AttributeSyntax,
        attachedTo declaration: some SwiftSyntax.DeclGroupSyntax,
        providingExtensionsOf type: some SwiftSyntax.TypeSyntaxProtocol,
        conformingTo protocols: [SwiftSyntax.TypeSyntax],
        in context: some SwiftSyntaxMacros.MacroExpansionContext
    ) throws -> [SwiftSyntax.ExtensionDeclSyntax] {
        // 将传入的协议列表拼接成扩展的协议声明部分
        let protocolNames = protocols.map { $0.trimmed.description }.joined(separator: ", ")
        let extensionDecl = try ExtensionDeclSyntax("extension \(type.trimmed): \(protocolNames)") {
            // 在这里添加协议的默认实现(如果需要)
        }
        return [extensionDecl]
    }
}

关键说明

  • 通过@attached(conformances: ...)告诉编译器:该宏负责为目标类型添加指定协议的一致性,编译器不会再质疑一致性的来源。
  • 使用conformingTo参数而非硬编码协议,让宏的实现更灵活,也符合Swift宏的设计规范。
  • 确保FormatableDomainError协议在宏模块中可见(若宏在独立模块),或与宏定义在同一模块内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:28:21