There's plenty of statements in the original post (including the title) that one can disagree with, not just questions (which, given the statements, clearly imply a certain position), like:
About this
that's a matter of personal preference, but thinking in terms of constructors is objectively more discoverable.
Assuming that a: A, b: B, c: C and d: D, consider the following function:
func foo(_: D) {}
it requires a D, so one could call it like this:
foo(a.b.c.d)
but to do this, one must know that d is a member of c that is a member of b that is a member of a, so one must "think backwards" to get how to finally produce a d, and start with a.
Imagine instead that D has a .d(_: C) constructor, and C has a .c(_: B) constructor and so on. When calling foo(...) one must just write the . to be presented, by autocompletion, with the .d constructor. .d(...) would then require a C, a would then write the . to be presented with the .c constructor (in fact, one doesn't need to know that .d requires a C, it would be obvious from the autocompletion).
So, the function call would literally be automatically produced by autocompletion, like this:
foo(.d(.c(.b(.a))))
this would flow very naturally and effortlessly from autocompletion.
Now, this is a rather extreme example, but it shows that converting types with a static member of the target type allows to start thinking about what's required in a particular context, autocomplete that member, and then if the member requires something else recurse on the . syntax to "discover" the options.