Нет разумного способа сделать это. #available или @available позволяют различать некоторые фрагменты кода или целые классы, но не само приложение.
Вы можете использовать @available, чтобы заставить замолчать предупреждения о структуре или классах SwiftUI с целью развертывания 12.0, но в этом случае вам необходимо полностью дублировать пользовательский интерфейс из раскадровок (.xib, как угодно), используя Swift UI. Более того, совершенно другой подход «связывания» также потребует от вас переопределить существующую логику в этом приложении (не имеет значения, какую архитектуру вы использовали ранее). Любой VIPER, VIP, MVC предназначен для отправки уведомлений об изменении данных в ViewController (View)? в Swift UI вам нужно использовать Bindable объекты. Это также заставляет вас создавать дубликаты ViewModels (если они у вас есть), потому что они будут другими.
Результат? У вас есть вторая реализация пользовательского интерфейса, вторая реализация моделей представлений, дополнительные 80% реализации презентатора (или что вы используете). Только базы данных и остальные менеджеры будут использоваться повторно. И это действительно, если у вас очень хорошая архитектура. Не забывайте, что вам нужно поддерживать две ветви пользовательского интерфейса и логику.
Существует два способа: перестроить почти полное приложение для поддержки SwiftUI и UIKit или, если вы не хотите, чтобы поддерживалась только одна iOS 13, подождите, пока выйдет iOS 14, а затем поддерживать оба из них с SwiftUI