Engine 是一个基于 Swift Macro 的性能驱动框架,专为 SwiftUI 定制组件开发设计。通过一个 @StyledView 宏,就能让任意视图快速拥有类似系统控件的 ViewStyle 能力,在保持原生性能和流畅体验的同时,大量减少样板代码,让自定义 View 的样式管理变得前所未有的简洁和自然。
适用人群:正在构建可复用组件库的 SwiftUI 开发者;需要让自定义视图支持多种风格、主题的项目负责人;追求代码简洁性与可维护性的 iOS / macOS 应用工程师
适用场景:为设计系统中的卡片、标签、按钮等组件统一创建和管理多种视觉风格;在需要动态切换外观(如夜间模式、品牌主题)的场景中减少样式分支;封装第三方 UI 组件时为其提供与系统原生一致的样式 API
推荐理由:Engine 把原本需要手动实现 ViewStyle 协议、编写大量配置与修饰符的繁琐流程,压缩为一个 @StyledView 宏。它完全在编译期展开,不增加运行时开销,且生成的 API 风格贴近原生 SwiftUI。如果你的项目中有大量自定义视图需要样式管理,这个框架能让你的代码量显著减少,同时保持极高的可读性。
项目定位与背景
在 SwiftUI 中,系统控件如 Button、Label、Toggle 都提供了优雅的 Style 协议,允许开发者通过自定义 ButtonStyle、LabelStyle 等来统一调整外观。然而,当我们自己封装一个复合 View 时,想要实现同样流畅的 ViewStyle 机制,往往需要手动声明配置结构体、编写 Style 协议以及对应的 ViewModifier,过程重复且容易出错。Engine 的出现正是为了解决这一痛点,它让任意自定义视图都能像系统控件一样,轻点一个宏就获得完整的样式支持,同时强调“不牺牲性能”,所有展开工作都在编译期完成。
核心功能与技术架构
Engine 的核心是一套围绕 @StyledView 宏构建的协议与代码生成系统。开发者只需让自己的视图遵循 StyledView 协议并添加 @StyledView 宏,宏就会自动生成配套的 ViewStyle 协议、配置结构体和 Modifier。例如,定义一个 LabeledView,宏会同步生成 LabeledViewStyle 协议及 LabeledViewStyleConfiguration,开发者可以直接在扩展中实现各种具体样式,如 VerticalLabeledViewStyle,并通过 .labelViewStyle() 修饰符应用。这种机制让样式定义与视图本身解耦,同时保持类似原生 API 的调用习惯。
Engine 内部高度模块化,Engine 包提供基础框架,可选的 EngineMacros 包负责宏展开。部署要求覆盖 iOS 13、macOS 10.15 等全平台,且依赖 Swift 5.9 的宏特性,需要 Xcode 16.4 以上版本。考虑到宏需要用户手动信任,项目贴心地给出了 CI 环境中使用 -skipMacroValidation 标志的建议。此外,作者还维护了 Turbocharger、Transmission、Metallic、Ignition 一整套性能驱动框架,Engine 可以与它们无缝协作,形成更高效的工具链。
创新点与亮点
Engine 最大的创新在于用 Swift Macro 这一相对新的语言特性,彻底消灭了手写 ViewStyle 样板代码的历史。它并不是简单封装一个 Modifier,而是通过编译期代码生成,让每个自定义 View 都拥有和原生控件风格完全一致的样式协议。这种做法的好处是生成的代码没有额外运行时开销,且完全类型安全,Xcode 自动补全和错误提示仍然友好。
另一个亮点是它对“习惯性原则”的坚守。无论你之前如何使用系统的 ButtonStyle 或 LabelStyle,使用 Engine 创建的自定义样式几乎不需要学习成本。这种一致性的背后,是作者对 SwiftUI 风格和性能的深度理解。此外,Engine 的示例项目包含完整的使用演示,文档也托管在 Swift Package Index 上,极大降低了上手门槛。
与同类项目对比
相比于直接在 SwiftUI 中手动实现 ViewStyle,Engine 的宏方案让这一过程从“按部就班的体力活”变成“一行宏指令”。其他一些开源样式框架往往只提供预设主题切换,灵活性不足,或者需要依赖复杂的 ViewModifier 嵌套,性能调优困难。而 Engine 完全在编译期生成代码,生成的配置结构体和原系统样式设计保持对齐,既轻量又通用。如果非要说尚存不足,那就是当前宏语法高亮和调试支持还不够完善,Xcode 中对于宏生成类型无法着色提示,这是 Swift Macro 生态需要共同面对的问题。
上手指南与快速开始
使用 Swift Package Manager 添加 Engine 即可开始。在 Package.swift 中依赖 Engine,并选择添加 EngineMacros 以启用宏功能。导入后,创建一个符合 StyledView 协议的自定义视图,标记 @StyledView,然后就可以在扩展中自由实现各种 Style。例如,定义一个 LabeledView,随后编写 VerticalLabeledViewStyle 或 HorizontalLabeledViewStyle,并通过 .labeledViewStyle() 方法应用。如果要在 CI 上构建,记得在 xcodebuild 命令中加入 -skipMacroValidation 参数。整个过程干净利落,原有的视图逻辑完全不受影响。
总结与展望
Engine 用一个小小的宏,撬动了 SwiftUI 自定义视图架构中一块长期被忽视的基石。它不仅让开发者告别了重复的样式协议和 Modifier 定义,更树立了一种性能优先、习惯至上的设计哲学。在 SwiftUI 生态日渐成熟,宏被越来越多框架接受的当下,Engine 的思路极有可能成为社区构建可组合 UI 组件的标准实践。随着 Xcode 对宏支持逐渐完善,以及作者持续打磨其周边生态,Engine 有望让更多团队把精力从繁琐的样式管理转移到真正有创造力的交互设计上。
项目信息
| 项目名称 | nathantannar4/Engine |
| 编程语言 | Swift |
| Star 数 | 577 |
| Fork 数 | 36 |
| 主题标签 | apple, ios, iphone, macos, swift, swiftui |