LoginSignup
1

More than 3 years have passed since last update.

Sourcery(Stencil)で自前の変数の作り方

Posted at

本文

Sourcery でメタプログラミングやる時に、たまには自分で変数を作りたい時もあるかと思います。例えば「この型とこの型とこの型、内部実装が少しずつだけ違うのでメタプログラミングで実装したい、でもそもそも宣言も何もないからメタプログラミングで型名をまず変数宣言しないといけない」と言ったシチュエーションです。

残念ながら今の Sourcery のサンプルのほとんどは、 Equatable プロトコルの適合などのような、あとで extension で対応するものばかりで、最初から用意された変数(例えば types.implementing.AutoEquatable のようなものばかりです。自分で変数宣言どうすればいいかの情報が全くありませんでした。

そして Sourcery が内部で使うスクリプトは Stencil ですが、こちらも公式ドキュメント含めてそう言った情報特に見つかりませんでした…

が、どうにか関連プロジェクトの StencilSwiftKit で情報見つかりました!

{% set variable "value" %}

もしくは

{% set variable %}value{% endset %}

です!

そして配列を入れたいときは、残念ながら直接配列を入れる方法は見つかりませんでしたが、文字列の演算子 |split: を使えば文字列から配列が作れるので、今回の場合はこのように作れました:

{% set array "item1,item2,item3"|split:"," %}

これで [item1, item2, item3] の配列 array が作られます。

余談

実はなぜこれが欲しかったかというと、今まだリリースまで持っていけてないですが、Observer パターンだけに特化したライブラリー SteinsKit を作ってて、そこでほぼほぼ同じ実装になる VariableLazyVariable があって、それぞれ手書きで作るの大変だなと思ってメタプログラミングで頑張ろうと思い、いきなりこの「型名の変数作りたいんだけどどうすればいいんだっけ」の壁にぶつかりました。ちなみに最終的にできたのはこちらのファイルです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1