• 如何将 UIKit 项目迁移到 SwiftUI ?
  • 发布于 3天前
  • 22 热度
    0 评论
前言
随着技术的发展,开发者使用的工具和框架也在不断进步。自从 2019 年苹果推出 SwiftUI 后,开发者们迎来了一个现代化、声明式的用户界面构建方式,适用于所有苹果平台。然而,许多现有的 iOS 项目仍然只依赖于传统的 UIKit 框架,用 SwiftUI 都是做一些小组件之类的需求。不使用 SwiftUI 的原因有很多,其中最重要的就是成本问题,从 UIKit 迁移到 SwiftUI 是一项艰巨的任务,不过,通过细致的规划和执行,这个过程可以变得简单点。

今天,我们就来探讨一下如何将 UIKit 项目迁移到 SwiftUI,重点介绍其中的优点、挑战和最佳实践。

迁移到 SwiftUI 的优点
1.声明式语法
SwiftUI 提供了声明式语法,开发效率相对更高,而且更简单易用,开发者只需要描述所需的 UI 的样子和状态即可,框架会自动处理其余部分。这让代码更加简洁易读,减少了出错的可能性,UI 结构相对也更易于理解。

2.跨平台兼容性
SwiftUI 设计为无缝适用于所有苹果平台,包括 iOS、macOS、watchOS 和 tvOS。通过使用 SwiftUI,开发者可以利用一套代码,适配多个平台。

3.实时预览和更新
SwiftUI 提供了在 Xcode 中的实时预览功能,开发者可以在编写代码的同时实时查看 UI 更改。这种即时反馈循环加快了开发工作流,使开发迭代更加轻松高效。

迁移过程
1.评估现有代码库
首先,我们需要明确的是,不是所有代码都需要迁移,哪些相对更容易迁移,哪些相对复杂,确定需要迁移到 SwiftUI 的视图控制器、视图和其他 UI 组件。
根据复杂性、使用频率和应用程序的战略重要性来优先考虑迁移。一般来说相对独立的小模块是更容易迁移的,比如一个列表页,一个详情页,一个弹窗等。然后一步步去接近完全迁移的大目标。

2.转换 UIKit 视图到 SwiftUI 视图
开始迁移过程时,可以先将单个 UIKit 视图转换为 SwiftUI 视图。这个过程可以适当使用 AI 辅助,比如使用 ChatGPT,或者最近比较火的 Cursor 来辅助,效率将非常高。另外,如果你的视图复杂,没办法全部迁移到 SwiftUI,但是又需要和 SwiftUI 视图共存和交互,那么可以使用包装器来把 UIKit 视图包装成 SwiftUI 视图。

SwiftUI 提供了诸如 UIViewRepresentable 和 UIViewControllerRepresentable 之类的包装器,用于将 UIKit 视图和视图控制器集成到 SwiftUI 中。
import SwiftUI
struct MyUIKitView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        let uiView = UIView()
        // 堆代码 duidaima.com
        // 在这里自定义你的 UIView
        return uiView
    }

    func updateUIView(_ uiView: UIView, context: Context) {
        // 如有需要,在这里更新你的 UIView
    }
}
3.重写视图控制器到 SwiftUI
然后,你就可以慢慢把所有视图都迁移到 SwiftUI 了。单个视图完成后,就可以着手重写视图控制器,使用 SwiftUI 的导航和布局构建逻辑来重新实现 UIKit 视图控制器中的导航、布局和展示逻辑。
import SwiftUI

struct MySwiftUIView: View {
    var body: some View {
        NavigationView {
            VStack {
                Text("Hello, SwiftUI!")
            }
            .navigationTitle("Welcome")
        }
    }
}
4.将 SwiftUI 视图集成到现有的 UIKit 代码中
除了把 UIKit 的视图包装成 SwiftUI,我们还可能需要反向操作,即把 SwiftUI 的视图集成到现有的 UIKit 代码中。
import UIKit
import SwiftUI

class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建一个 SwiftUI 视图并将其添加到视图层次结构中
        let swiftUIView = MySwiftUIView()
        let hostingController = UIHostingController(rootView: swiftUIView)
        addChild(hostingController)
        view.addSubview(hostingController.view)
        hostingController.didMove(toParent: self)
    }
}
5.测试和迭代
在迁移到 SwiftUI 的过程中,因为改动量比较大,所以务必要彻底测试你的应用,以确保功能保持完整。

最佳实践
我们再来总结一下要点。
1. 从小开始
从迁移小的、独立的组件开始,一开始越小越好,不然容易放弃,然后再处理应用中比较大的业务。这样可以在最小化引入错误风险的同时慢慢迁移,还能在这个过程中让团队成员熟悉 SwiftUI 的语法。

2. 利用 UIKit 的互操作性
利用 SwiftUI 与 UIKit 的互操作性,将现有的 UIKit 视图和视图控制器集成到 SwiftUI 代码库中。这样可以最大限度的重用代码,以帮你按照自己的节奏逐步迁移到 SwiftUI。

3. 充分使用 SwiftUI 的特性提效
使用 SwiftUI 在 Xcode 中的实时预览功能,使用声明式语法,提高开发效率,快速迭代 UI 设计和功能。

4. 拥抱 SwiftUI 的范式
从 UIKit 到 SwiftUI 的切换,很重要的一点是编程思想的转变,UIKit 是命令式编程,而 SwiftUI 是声明式编程。应该拥抱 SwiftUI 的声明式范式,利用其内置功能进行状态管理、动画和布局。避免在 SwiftUI 中仍然使用 UIKit 的命令式语法,因为这会导致不必要的复杂性和样板代码。

结论
从 UIKit 迁移到 SwiftUI 是一个变革性的过程,近些年来苹果也在强推 SwiftUI,Android 中也上了 Jetpack Compose 这种类似的编程语言,再例如 Flutter 的 Dart 语言,可以说未来是声明式编程的天下。未来把 UIKit 项目迁移到 SwiftUI 是必然的趋势,趁现在 SwiftUI 还不成熟,趁早去熟悉和掌握,才能在未来的竞争中占据先机。
用户评论