UIKitでは、一連の UIView と UIView のサブクラスをまとめてビュー階層を記述します。UIViewをサブクラス化することによって自分自身のビューを作成することもできます。しかし、この View Description をAppKitやシリアライゼーションに再利用することはできません。UIKit と似たようなものに EnumKit があり、 View は列挙型のケースとして提供されています。これで View Description を使いまわすことができますが、EnumKit なしで (もしくはライブラリをフォークしないと)ビューを生成することができません。
'Final Tagless' は、Swift のプロトコルの内部にある強力な Self 型を用いて、双方の世界をベストな状態にします。
Expression Problem を解決する

このモックアップを見て下さい、どうやって作るのか
ボタンとスタックビュー

全部UIViewですね
じっくり見ると真ん中はMapViewかもしれないですね。カスタムかもしれないです。

UIViewをサブクラス化すればいいですね
これは素晴らしいことです。UIKitの外側でアプリを作ることができる。
Macアプリを作るには?同じプロセスをNSViewとNSButtonで同じことをする必要がある。
またWebでも同じように作らなければいけない

この一つのビュー階層の表現が複数のプラットフォームにトランスフォームできればいいですよね?
でもそれはできるはずです本来。
これは一般的な問題を特定の例で説明している例であって、エクスプレッションプロブレムということです。

カスタマイズが難しい。新しいヴューの表現を作るのが難しい
関数プログラミングのコミュニティで補問題になっている。Swiftではどうしたらうまくいくのか
今日はついにこれを解決していきましょう

サブクラス化はうまくいかない。UIKitがサブクラスで問題が起きた時にViewヒエラルキーに反映されない
Enumはどうでしょう 問題が起きる
これらを解明することでソリューションが何なのか対応できるかが分かる。
EnumKitを考えます

特定のケースはUIVeiwの特定のサブクラスになります

case は必要なプロパティです。
別のビューが中には言っている、Viewを再帰的に使う、だから再帰的である必要があります。

2つのボタンを考えてみましょう


意味を与えるために再帰的トラバーサルをくわえます



UIKitを割り当てていく

NSViewも
とは言え問題は発生する


あたらしいViewをどう追加するか newViewのようなのを追加するのは良くない

両方を解決する必要があります


非網羅的Enumを使うのも考えて良いと思います。モジュールの外でextensionしてカスタマイズする



でもdefaultケースが必要になってしまいます。ここでまた困ってしまいます。
プロトコルを考えましょう


Viewから間接的なViewがある
Viewプロトコル

staticなメソッドとしてそれぞれのボタンが

StackViewには子供のViewがある
Selfに目を向けましょう

REALTypeがSelfに置き換えられます

追加する時はプロトコルを追加しましょう

階層構造をどう作ればよいでしょうか

Genericな関数を考えます


EnumではうまくいかなかったfullVeiwを考えます


意味は与えてないがVeiwのDescriptionです
UIKitのパワーを取り戻しましょう






もしこれをGoogleで検索してもっと知りたいなら

Final Tagless Styleで検索してみて下さい。
Expression Probremはもっと奥深いです
キャンバス上のダイアグラムを考えましょう 様々な形状があり階層構造にしていく

副作用があります、Itemが副作用そのもの


問題は拡張性の問題で2つでした、新しいアイテムを作る Final Tagless Approachはかいけつしてくれました。

もっと学ぶにはこちらです


