Avatar
Kishikawa Katsumi 1/6/2020 9:35 PM
https://github.com/kishikawakatsumi/swiftui-playground ^ Playgroundのコード公開しました。
SwiftUI Online Playground. Contribute to kishikawakatsumi/swiftui-playground development by creating an account on GitHub.
9:38 PM
Previewを出力するためにまず、 https://github.com/kishikawakatsumi/swiftui-playground/blob/master/PreviewProvider/Sources/PreviewProviderParser/main.swift ^ SwiftSyntaxで入力されたコードからPreviewProviderに準拠しているものを探します。 これは自由入力されたコードから探さないといけないので、方法はいくつかあるけど必要なプロセスだと思う。
9:42 PM
で、PreviewProviderはGroupとか複数画面サイズとかできるのでそれに対応するために(ちゃんと対応できてないけど。。。)一回ビルド、実行してPreviewProvider.previewsをMirrorを使ってリフレクションで構造を読み取ります。 modifierの指定を集めるのと、Groupを探してGroupがあったらXcodeの挙動と一致するように分割します。
9:45 PM
で、そのあとはUIHostingControllerに入れて画像として出力するのですが、その際に some View の方がわからないと渡せないので上記のリフレクションで構造を読む際に実際の型名を書き込んだソースコードを生成して、再度ビルドして実行します。 2回目の実行で画像が出力されます。
9:49 PM
改善したいところは2つあって、1回目のリフレクションで構造を読むところ、そもそもあまり正しく動いてないし、コードもいきあたりばったりで書いたやつだから美しくしたい。
9:52 PM
もう一つは、そもそも2回ビルドして実行しているのを可能ならやめたい。。。 実際の型を書き込むために1回目でリフレクションとコード生成、2回目で実行、としているのでこれはもっとスマートな方法があったら解決する気がします。 妥協したくないポイントは、PreviewをGroupやサイズなどで複数出力できるというところです。
9:52 PM
それを守りつつ、より良い方法を探したい。