Refactoring UIKit to SwiftUI: A step-by-step guide

by Adrian Perțe, iOS Lead Engineer

n the world of iOS development, SwiftUI has made a significant splash. With its declarative syntax, fewer lines of code, and live previews, SwiftUI is a compelling framework that offers considerable advantages over its predecessor, UIKit. But what if you already have a UIKit-based project? Is it feasible to refactor it to SwiftUI? The answer is a resounding yes! This article will guide you through the process of refactoring your UIKit app to SwiftUI.

Understand the Differences Between SwiftUI and UIKit

Before starting the transition, it's essential to understand the core differences between SwiftUI and UIKit.

  • Declarative vs. Imperative: SwiftUI uses a declarative paradigm. That means you describe the UI and its state, and SwiftUI will ensure that the view correctly reflects this. On the other hand, UIKit uses an imperative approach, where you need to tell the program how to reach the desired state.

  • State Management: SwiftUI provides built-in state management. This is a substantial improvement from UIKit, where developers must handle state changes manually.

  • UI Creation: SwiftUI uses Swift code for UI design, which drastically reduces the reliance on storyboard and simplifies version control. In UIKit, UI is often created using a combination of storyboard and code.

1. Integrate SwiftUI into Your Existing UIKit Project

SwiftUI is backward-compatible with UIKit, so you can introduce SwiftUI components into your UIKit project without having to refactor everything at once.

To use SwiftUI in your UIKit project:

  1. Create a SwiftUI View:
struct SwiftUIView: View {
    var body: some View {
        Text("Hello, SwiftUI!")
    }
}
  1. Use a UIHostingController to wrap the SwiftUI view, allowing it to be used within UIKit:
let swiftUIView = SwiftUIView()
let hostingController = UIHostingController(rootView: swiftUIView)

2. Break Down the UIKit View Hierarchy

Now that you have integrated SwiftUI into your project, the next step is to start refactoring your UIKit code. The best approach is to break down your UIKit views into smaller parts and refactor each part into SwiftUI.

Identify distinct elements in your UIKit view hierarchy and transform them into separate SwiftUI views. This piecemeal approach makes the task more manageable and less error-prone.

3. Translate UIKit Components to SwiftUI Equivalents

Some UIKit components have direct SwiftUI equivalents. For example:

UILabel in UIKit becomes Text in SwiftUI. UIButton in UIKit becomes Button in SwiftUI. UIImageView in UIKit becomes Image in SwiftUI. Some components, like UITableView and UICollectionView, don't have direct equivalents in SwiftUI. However, SwiftUI provides the List and ScrollView views that can handle similar tasks in most cases.

4. Handle Navigation and User Interaction

SwiftUI simplifies navigation with the NavigationView and NavigationLink views. You can translate your UIKit navigation code into these SwiftUI components.

For user interaction, SwiftUI provides several modifiers like .onTapGesture{}, .onLongPressGesture{}, and .onSwipeGesture{} to handle various user interactions easily.

5. Test, Test, Test.

After translating your UIKit views into SwiftUI, testing becomes crucial. Ensure that your SwiftUI views behave as expected. Test on different device types, orientations, and accessibility settings to confirm that your UI is versatile and robust.

Conclusion

Transitioning from UIKit to SwiftUI is not just a matter of translating UIKit components to SwiftUI counterparts. It's about embracing a new way of thinking and structuring your app. However, once you get the hang of it, you'll appreciate the simplicity and efficiency that SwiftUI brings to the table. Happy refactoring!

Not sure where to start?

We've refactored a bunch of iOS apps already — and we continue to provide this ongoing service to our clients. If you're looking for a partner to help you refactor your app, we'd love to hear from you. Get in touch to learn more about our iOS development services.

More articles

How hard is it to build a native macOS app with SwiftUI?

It's been a number of years that we could do this already. Is it now the moment to ditch Electron apps? Let's find out.

Read more

Is 2023 the Time to Fully Switch to SwiftUI?

As SwiftUI matures and continues to disrupt the app development landscape, developers are asking the key question: Is it time to fully embrace SwiftUI? This article explores the pros and cons of this pivotal decision.

Read more

Tell us about your project

Our offices