先来看看效果
优化前
优化后
经过优化,可以发现代码行数减少了一半,而除去的代码其实就是我们为了解析 JSON 的模板代码。对于我来说这些甚至可以说是冗余的代码,我是坚决的瘦 Model 的拥护者。Model 层中除必要的数据结构,我不希望出现有其他冗余的代码,影响阅读。但我们又必须让我们 Model 拥有解析 JSON 的能力。
基于上述的需求,我的解决方法是利用Sourcery实现AutoUnbox,在不增加模板代码的基础上,让 Model 实现Unboxable。(本文中以 Unbox 为例,也可替换为Codable等)
第一步: 认识Sourcery
Sourcery is a code generator for Swift language, built on top of Apple’s own SourceKit. It extends the language abstractions to allow you to generate boilerplate code automatically.
Sourcery 是一个 Swift 的代码生成器,基于 Apple 自家的 SourceKit。它通过扩展语言的抽象性,来实现了自动生成模板代码。
第二步: 书写模板
在项目中创建识别的标记:
模板是通过stencil 语言书写的。
第三步: Podfile 中引入 Sourcery
- 在 podfile 中加入 pod ‘Sourcery’
- 执行 pod install
第四步: add Script
在项目的Build Phases增加一个 Script,命名为 Sourcery。$PODS_ROOT/Sourcery/bin/sourcery --sources $SRCROOT/creams --templates $SRCROOT/creams/Infrastructure/Sourcery/AutoUnbox/AutoUnbox.stencil --output $SRCROOT/creams/Infrastructure/Sourcery/
注意请将 Sourcery 放置在第一位,保证在代码编译之前,模板代码已经生成完毕
测试
- comand + B
- 在$SRCROOT/creams/Infrastructure/Sourcery/路径下会 c 生成一个 AutoUnbox.generated.swift,这个文件中包含了所有生成的代码,即所有需要实现 Unboxable 的 Model 的 Extension。