本文
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 を作ってて、そこでほぼほぼ同じ実装になる Variable
と LazyVariable
があって、それぞれ手書きで作るの大変だなと思ってメタプログラミングで頑張ろうと思い、いきなりこの「型名の変数作りたいんだけどどうすればいいんだっけ」の壁にぶつかりました。ちなみに最終的にできたのはこちらのファイルです。