如何在SwiftGen自定义模板中为Asset枚举添加@MainActor修饰符
解决SwiftGen生成Asset枚举的并发安全报错
问题原因
Xcode的并发安全检查触发报错,是因为ColorAsset未实现Sendable协议,且默认生成的静态属性没有线程访问约束。直接手动给枚举加@MainActor会被SwiftGen重新生成代码覆盖,所以必须修改SwiftGen的模板来实现永久生效。
修改SwiftGen自定义模板步骤
定位模板文件
找到你的SwiftGen Assets模板(默认是Assets.stencil),位置通常是:- 全局模板路径:
~/.config/swiftgen/templates/assets/swift5/Assets.stencil - 项目本地自定义模板:如果是项目内维护的模板,直接找到对应
.stencil文件
- 全局模板路径:
添加@MainActor修饰
打开模板文件,找到枚举定义的代码块,在枚举前添加@MainActor修饰符:@MainActor enum {{enumName}} { {% for asset in assets %} static let {{asset.name}} = {{asset.type}}Asset(name: "{{asset.name}}") {% endfor %} }或者如果需要单独给每个静态属性加约束,也可以修改属性行:
enum {{enumName}} { {% for asset in assets %} @MainActor static let {{asset.name}} = {{asset.type}}Asset(name: "{{asset.name}}") {% endfor %} }配置SwiftGen使用自定义模板
在项目的swiftgen.yml配置文件中,指定修改后的模板路径:assets: inputs: ./Resources/Assets.xcassets # 你的Assets目录路径 outputs: templatePath: ./Path/To/Your/Custom/Assets.stencil # 自定义模板路径 output: ./SharedResources/Generated/Assets.swift # 生成代码的输出路径重新生成代码
运行SwiftGen命令重新生成Asset枚举代码,此时生成的代码会自动带有@MainActor修饰,解决并发安全报错。
额外优化(可选)
如果ColorAsset是不可变类型,可以给它添加Sendable协议实现,进一步增强并发安全性:
extension ColorAsset: Sendable {}
不过由于颜色资源属于UI相关内容,推荐优先使用@MainActor约束访问主线程,符合UIKit/SwiftUI的线程模型规范。
内容的提问来源于stack exchange,提问作者Pavlo Chorney
相关产品推荐
相关产品推荐

