Only because this example makes the mistake of passing the view model in from an external source. The fact that a view has view model (or not) is an implementation detail that should be private to the view.
Regarding the Hashable requirement, you might consider making a few common wrappers like Callback that are Hashable in their own right, and which then avoids having to make each and every destination type conform to Hashable and Equatable.
case view2(Callback)
Good article.