Interesting implementation. Probably the biggest issue I have with it, however, is that every time you compose a new set of views it's always enclosed within another UIView.
Second is that by using a class the second you want to create some sort of subview with a parameter you're once again forced to write an initializer for it.
You might take a peek at Builder which uses structs and ResultBuilders to create a very SwiftUI-like set of views and subviews in UIKit.
ResultBuilders also give you access to a lot of other SwiftUI-like features like using ifs and switches and ForEach loops within your view definitions.
Don't know if you've considered it, but the next step in this sort of thing is figuring out some sort of dynamic data and attribute binding mechanism. e.g. what happens when you have some view nested deep within a set of declarative views, and that view now wants to be hidden or disabled or have its color changed?
These sort of things are fun to play with and, as you mentioned, can teach us a lot about Swift.
This was my take on it...