当前位置: 首页 > news >正文

Swift元编程终极指南:使用Sourcery自动生成UserDefaults偏好设置代码

Swift元编程终极指南:使用Sourcery自动生成UserDefaults偏好设置代码

【免费下载链接】SourceryMeta-programming for Swift, stop writing boilerplate code.项目地址: https://gitcode.com/gh_mirrors/so/Sourcery

厌倦了编写重复的UserDefaults代码?Sourcery是Swift元编程的终极工具,它能自动生成样板代码,让你告别手动编写UserDefaults偏好设置的繁琐工作。作为iOS和macOS开发中最强大的代码生成工具之一,Sourcery已经被超过40,000个项目使用,包括Airbnb、Bumble和New York Times等知名应用。

为什么需要自动生成UserDefaults代码?

在Swift开发中,UserDefaults是存储用户偏好设置和配置信息的标准方式。然而,手动管理UserDefaults存在诸多痛点:

  • 重复代码:每个属性都需要getter、setter和key定义
  • 类型安全缺失:字符串key容易拼写错误
  • 维护困难:添加新属性时需要修改多个地方
  • 线程安全问题:需要手动处理同步

使用Sourcery,你可以通过简单的模板定义,自动生成类型安全、线程安全的UserDefaults包装器代码。这不仅节省时间,还能减少错误。

Sourcery守护模式:实时代码生成体验

Sourcery的守护模式(daemon mode)是其最强大的功能之一。当你修改模板或源代码时,它会实时生成对应的代码,让你立即看到效果。

Sourcery守护模式实时生成UserDefaults包装器代码

守护模式通过--watch参数启用,它会监控你的源代码和模板文件的变化,自动重新生成代码。这意味着你可以在编写UserDefaults包装器的同时,立即看到生成的代码,实现真正的"所见即所得"开发体验。

如何为UserDefaults创建自定义模板

1. 安装Sourcery

首先,你需要安装Sourcery。最简单的方式是通过Homebrew:

brew install sourcery

或者,你也可以从GitHub仓库克隆并构建:

git clone https://gitcode.com/gh_mirrors/so/Sourcery cd Sourcery make install

2. 创建UserDefaults模板

在项目中创建一个新的模板文件,例如UserDefaults.stencil。这个模板将定义如何为你的Swift类型生成UserDefaults包装器:

{% for type in types.all where type.annotations.userDefaults == true %} // MARK: - {{ type.name }} UserDefaults Extension extension {{ type.name }} { {% for variable in type.storedVariables %} static var {{ variable.name }}: {{ variable.typeName }} { get { return UserDefaults.standard.value(forKey: "{{ type.name }}.{{ variable.name }}") as? {{ variable.typeName }} ?? {{ variable.defaultValue }} } set { UserDefaults.standard.set(newValue, forKey: "{{ type.name }}.{{ variable.name }}") } } {% endfor %} } {% endfor %}

3. 在源代码中添加注解

在你的Swift类型上添加Sourcery注解,告诉它应该为哪些类型生成UserDefaults代码:

// sourcery: userDefaults = true struct AppSettings { // sourcery: defaultValue = "false" var isFirstLaunch: Bool // sourcery: defaultValue = "\"en\"" var language: String // sourcery: defaultValue = "0" var launchCount: Int }

4. 运行Sourcery生成代码

使用命令行运行Sourcery:

sourcery --sources ./Sources --templates ./Templates/UserDefaults.stencil --output ./Generated

或者创建配置文件.sourcery.yml

sources: - ./Sources templates: - ./Templates/UserDefaults.stencil output: ./Generated args: target: MyApp

高级UserDefaults功能模板

Sourcery的强大之处在于你可以创建复杂的模板来处理各种场景:

支持Codable对象的模板

{% for type in types.all where type.annotations.userDefaultsCodable == true %} // MARK: - {{ type.name }} Codable UserDefaults extension {{ type.name }} { {% for variable in type.storedVariables %} static var {{ variable.name }}: {{ variable.typeName }}? { get { guard let data = UserDefaults.standard.data(forKey: "{{ type.name }}.{{ variable.name }}") else { return nil } return try? JSONDecoder().decode({{ variable.typeName }}.self, from: data) } set { let data = try? JSONEncoder().encode(newValue) UserDefaults.standard.set(data, forKey: "{{ type.name }}.{{ variable.name }}") } } {% endfor %} } {% endfor %}

支持同步到iCloud的模板

{% for type in types.all where type.annotations.userDefaultsSync == true %} // MARK: - {{ type.name }} iCloud Sync extension {{ type.name }} { {% for variable in type.storedVariables %} static var {{ variable.name }}: {{ variable.typeName }} { get { return NSUbiquitousKeyValueStore.default.object(forKey: "{{ type.name }}.{{ variable.name }}") as? {{ variable.typeName }} ?? {{ variable.defaultValue }} } set { NSUbiquitousKeyValueStore.default.set(newValue, forKey: "{{ type.name }}.{{ variable.name }}") NSUbiquitousKeyValueStore.default.synchronize() } } {% endfor %} } {% endfor %}

使用Sourcery内置模板

除了自定义模板,Sourcery还提供了许多内置模板,你可以在Templates/Templates/目录中找到:

  • AutoCodable.swifttemplate:自动生成Codable实现
  • AutoEquatable.stencil:自动生成Equatable实现
  • AutoHashable.stencil:自动生成Hashable实现
  • AutoMockable.stencil:自动生成Mock对象

Sourcery生成模拟对象教程视频封面

最佳实践和性能优化

1. 批量生成

对于大型项目,建议使用Sourcery的批量生成功能。创建一个配置文件,一次性生成所有需要的代码:

configurations: - sources: - ./Sources templates: - ./Templates/UserDefaults.stencil - ./Templates/AutoCodable.swifttemplate output: ./Generated args: target: MyApp

2. 缓存优化

Sourcery支持缓存解析结果,显著提高生成速度。在配置文件中启用缓存:

sources: - ./Sources templates: - ./Templates/UserDefaults.stencil output: ./Generated cacheBasePath: ./SourceryCache

3. 集成到Xcode构建流程

将Sourcery集成到Xcode的构建流程中,确保生成的代码始终是最新的:

  1. 在Xcode中添加"Run Script"构建阶段
  2. 添加Sourcery命令
  3. 将生成的文件添加到项目中

常见问题解答

Q: Sourcery生成的代码安全吗?

A: 是的,Sourcery生成的代码与手动编写的代码一样安全。它基于SwiftSyntax,这是Apple官方的Swift语法分析库。

Q: 如何调试模板问题?

A: 使用--verbose参数查看详细日志,或使用--disableCache禁用缓存以确保使用最新的模板。

Q: Sourcery支持SwiftUI吗?

A: 是的,Sourcery完全支持SwiftUI。你可以为SwiftUI的@AppStorage等属性包装器创建模板。

Q: 生成的代码会影响应用性能吗?

A: 不会。生成的代码在编译时就已经存在,运行时没有任何额外开销。

开始你的Swift元编程之旅

Sourcery不仅限于UserDefaults代码生成,它还可以用于:

  • 自动生成网络层代码
  • 创建数据模型转换器
  • 生成测试桩(stubs)和模拟对象(mocks)
  • 自动实现协议一致性
  • 生成文档和接口定义

通过使用Sourcery,你可以将重复的编码工作自动化,专注于业务逻辑和创新的实现。开始尝试创建你自己的UserDefaults模板,体验Swift元编程的强大能力吧!

记住,好的工具应该让你更高效,而不是更忙碌。Sourcery正是这样一个工具——它处理重复的代码,让你专注于真正重要的事情。

【免费下载链接】SourceryMeta-programming for Swift, stop writing boilerplate code.项目地址: https://gitcode.com/gh_mirrors/so/Sourcery

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/556472/

相关文章:

  • SQL视图实战:5个真实业务场景下的数据视图应用案例(附代码)
  • 终极指南:如何利用nvim-tree.lua实现文件重命名全自动化方案
  • Qwen-Image-Edit参数详解:如何调整CFG值平衡指令遵循度与图像保真度
  • VasDolly多线程优化实战:应对海量渠道打包挑战
  • Buildah容器调试终极指南:10个实用技巧快速解决构建问题
  • 告别单文件编译:VSCode + MinGW多文件C++项目高效开发指南
  • fluent_edem流固耦合方面的教学或者代做或者代码二次开发,气液固三相耦合。 接口优化...
  • Hexo Butterfly主题终极页脚导航配置指南:10分钟打造专业网站内链结构
  • Node.js日志标准化终极指南:使用morgan构建团队统一日志规范
  • tunnelto终极指南:构建高性能本地服务全球访问的高效方案
  • Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37%
  • caj2pdf高级功能:如何快速为CAJ转换PDF添加大纲和目录导航
  • TOPSIS算法实战:用Python给河流水质排个名,附完整代码与避坑指南
  • Swift Markdown扩展开发:如何实现自定义Inline Nodes和Block Containers
  • Phi-3-Mini-128K项目实战:从零搭建一个Java面试题库与智能答疑系统
  • 告别显卡驱动残留困扰:Display Driver Uninstaller的深度清理全解析
  • 终极指南:掌握Starlight文档导航自定义排序的7个高级技巧
  • 终极指南:如何在ComfyUI中轻松使用LTX-2 AI视频生成插件
  • 实战指南:如何用Python+Spacy快速搞定非结构化文本中的实体识别(附代码)
  • 单片机程序运行时间测量方法与优化实践
  • 计算机毕业设计springboot城市新能源车辆租赁换电管理系统 基于SpringBoot的城市电动出行租换电综合服务平台 Java技术驱动的城市绿色交通电池共享运营管理系统
  • GPT-Neo终极自动布局指南:如何轻松实现高效分布式训练
  • Vue+DataV+Echarts实战:从零搭建企业级数据可视化大屏(附完整代码)
  • 微信小程序集成通义千问:打造悬浮窗智能对话助手
  • 如何用Hypothesis测试框架提升Python开发效率:10个实用技巧
  • SpinningMomo终极指南:如何用专业工具提升《无限暖暖》摄影体验
  • 终极Star History数据格式指南:掌握JSON响应与API版本控制的完整教程
  • Zynq AXI DMA实战:从零配置S_AXIS_S2MM到M_AXIS_MM2S的完整数据流(Vivado 2023版)
  • 网盘直链下载解决方案:突破限速瓶颈的技术实现与应用指南
  • 【2026游戏报错修复,加速】DirectX修复工具下载安装全攻略:一键解决游戏报错问题