I think they serve different purposes.
Catalyst is mostly used when you’ve already written your iPad app (either in UIKit or iOS specific SwiftUI) and now you want to make that app available on Mac without rewriting parts of the code.
You can indeed write a multiplatform app in SwiftUI nowadays.
That’s what I’m doing with Volum (https://lowtechguys.com/volum) which easily shares 95% of the code between macOS, iOS and iPadOS, and only platform specific code like keyboard shortcuts or volume OSD is isolated.
But you kinda have to start with that multiplatform mindset from the start, otherwise you’ll soon find out you used too many custom NSViews and Cocoa APIs, your UI is not designed for portrait mode, and it’s a burden to place #if os(macOS) guards all over the place now.
Agree with the others: SwiftUI is a long, long way from being ready for prime time at this point. In practice you're going to be stuck using a nasty, ugly mixture of SwiftUI and AppKit/UIKit for anything beyond the most basic design, and that way lies madness (at least for me).
But I also agree that SwiftUI is very promising, and I like what I've seen a lot. It's just not there yet.
SwiftUI is still a little rough in some places though it is growing fairly quickly. If you are doing simple UIs where there are already UI components built, it works well, but if you need more custom or more complex you get into the weeds pretty quickly.
Catalyst is helpful for the near term (next few years?) to bring over more complex iOS apps that use the iOS UI framework. That gives developers a product now while they work on a SwiftUI version or whatever direction they end up going.
You can indeed write a multiplatform app in SwiftUI nowadays.
That’s what I’m doing with Volum (https://lowtechguys.com/volum) which easily shares 95% of the code between macOS, iOS and iPadOS, and only platform specific code like keyboard shortcuts or volume OSD is isolated.
But you kinda have to start with that multiplatform mindset from the start, otherwise you’ll soon find out you used too many custom NSViews and Cocoa APIs, your UI is not designed for portrait mode, and it’s a burden to place #if os(macOS) guards all over the place now.