It sounds like you want dynamic dispatch to a non-existential protocol which is not part of the static type information at the call site.
There is, technically, a way to do this. It’s not pretty, it’s not obvious, and it wasn’t designed intentionally, but it does exist.
See the links in this comment for details. No guarantees about runtime performance though.