Wrappres' Studio.

利用 Sourcery,进一步优化 Model 层,减少模板代码

字数统计: 418阅读时长: 1 min
2018/12/18 Share

先来看看效果

优化前

优化前

优化后

优化前
经过优化,可以发现代码行数减少了一半,而除去的代码其实就是我们为了解析 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。它通过扩展语言的抽象性,来实现了自动生成模板代码。

第二步: 书写模板

在项目中创建识别的标记:
AutoUnbox
模板是通过stencil 语言书写的。
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 放置在第一位,保证在代码编译之前,模板代码已经生成完毕
Script

测试

  • comand + B
  • 在$SRCROOT/creams/Infrastructure/Sourcery/路径下会 c 生成一个 AutoUnbox.generated.swift,这个文件中包含了所有生成的代码,即所有需要实现 Unboxable 的 Model 的 Extension。
    code
CATALOG
  1. 1. 先来看看效果
    1. 1.1. 优化前
    2. 1.2. 优化后
  2. 2. 第一步: 认识Sourcery
  3. 3. 第二步: 书写模板
  4. 4. 第三步: Podfile 中引入 Sourcery
  5. 5. 第四步: add Script
  6. 6. 测试