We can use Framework SwiftUI only from iOS 13.0+. So how to incorporate this framework from the deployment Target 10.0 or at least 12.0.
Although @DenFav is absolutely right - supporting deployment target below iOS 13 with SwiftUI is a pain, but it is possible.
Steps:
Link the framework weakly (I used this answer):
Adding -weak_framework SwiftUI to Other Linker Flags fixed my issue
Wrap all SwiftUI calls with canImport (see answer):
#if canImport(SwiftUI) && canImport(Combine)
This will allow you to build and archive with deployment target < iOS 13.
Optional:
Now the question is: how to deal with viewModels. I solved this with my own implementation. You can check the solution in the public repo of Ruuvi Station. Note: the code is complex (VIPER), that's why I'll shortly describe the main ideas.
The viewModel implementation is in Classes/Presentation/Binding.
I'm using these viewModels, wrapping them with ObservableObject for SwiftUI.
You can still observe changes made in SwiftUI code.
The result is: iOS 13 uses SwiftUI code for Presentation Layer, while iOS 12 and lower is using traditional UIKit code.
The viewController is responsible for determining if SwiftUI code can be used.