SwiftUI 是如何改变 iOS 开发游戏规则的?

打印 上一主题 下一主题

主题 1010|帖子 1010|积分 3034

SwiftUI 是 Apple 推出的今世化声明式 UI 框架,实用于 iOS、macOS、watchOS 和 tvOS 开发。
SwiftUI 与传统 UIKit(Swift 和 Objective-C) 的优劣势对比:


SwiftUI 的优势

一. 声明式编程



  • 优势:

    • SwiftUI 利用声明式语法,直接描述界面和行为。开发者只需关注“做什么”,而不必逐步操纵视图层次布局。
    • 示例:
      1. Text("Hello, World!")
      2.     .font(.title)
      3.     .foregroundColor(.blue)
      复制代码
    • 传统 UIKit: 必须手动操纵 UILabel、设置字体和颜色等属性,代码量更多。


二. 实时预览(Live Preview)



  • 优势:

    • Xcode 的实时预览功能允许开发者在编写代码时立即看到界面效果,大幅提升开发服从。
    • 传统 UIKit:

      • 必须运行模拟器或真机测试,调试 UI 改动耗时较长。



三. 跨平台支持



  • 优势:

    • 一套代码可运行于 iOS、macOS、watchOS 和 tvOS,简化了多平台开发。
    • 传统 UIKit:

      • UIKit 仅支持 iOS 开发,其他平台必要利用 AppKit 等不同框架,代码难以复用。



四. 代码简洁



  • 优势:

    • SwiftUI 将 UI 和逻辑绑定在一起,通过数据驱动视图更新,减少手动代码编写。
    • 示例:
      1. @State private var count = 0
      2. Button("Tap me: \(count)") {
      3.     count += 1
      4. }
      复制代码

      • 点击按钮后,count 的厘革会自动更新界面。

    • 传统 UIKit: 必要手动更新 UILabel 的文本内容。


五. 动画和过渡更简单



  • 优势:

    • SwiftUI 提供内置的简洁动画 API。
    • 示例:
      1. Rectangle()
      2.     .frame(width: isExpanded ? 200 : 100)
      3.     .animation(.easeInOut, value: isExpanded)
      复制代码
    • 传统 UIKit: 必须利用 UIView.animate,手动管理动画的起始和终止状态。


六. 今世开发体验



  • 优势:

    • 充实利用 Swift 的语言特性,如范例安全、模块化和简洁语法。
    • 传统 Objective-C:

      • 语法复杂,开发服从相对较低,不支持今世语言特性。



SwiftUI 的劣势

一. 兼容性问题



  • 劣势:

    • SwiftUI 最低支持 iOS 13,对于必要兼容旧体系的项目并不实用。
    • 传统 UIKit:

      • 支持更早的 iOS 版本,例如 iOS 9 或 iOS 10。



二. 生态不成熟



  • 劣势:

    • SwiftUI 的生态和文档不如 UIKit 完善,部分高级或定制化需求较难实现。
    • 传统 UIKit:

      • 已成熟多年,生态体系丰富,大量第三方库和文档支持。



三. 学习曲线



  • 劣势:

    • 对于熟悉 UIKit 的开发者,必要顺应全新的声明式编程模型。
    • 传统 UIKit 和 Objective-C:

      • 对于已有经验的开发者,切换到 SwiftUI 可能会有顺应期。



四. 性能开销



  • 劣势:

    • 在复杂的场景下(如自界说画图、大量动态数据渲染等),SwiftUI 的性能可能不如 UIKit。
    • 传统 UIKit:

      • 性能优化手段更多,适合高性能需求场景。



五. 工具限制



  • 劣势:

    • SwiftUI 的 Live Preview 功能有时不稳固,尤其是项目复杂时,可能出现无法预览或 Xcode 瓦解的情况。
    • 传统 UIKit:

      • 固然没有实时预览,但调试工具更稳固。



UIKit(Swift 和 Objective-C)的优势

1. 成熟稳固



  • 优势:

    • UIKit 是苹果多年积聚的传统框架,功能全面且稳固,实用于任何项目。


2. 第三方库支持丰富



  • 优势:

    • 大量的第三方库和工具支持 UIKit,开发者可以快速实现复杂功能。
    • SwiftUI: 第三方库生态尚未完善。


3. 高性能与灵活性



  • 优势:

    • UIKit 提供了更低层级的 API,开发者可以对性能敏感的部分举行手动优化。
    • 例如,通过 Core Graphics 或 Core Animation 提供精准的性能调优。


4. 兼容性好



  • 优势:

    • UIKit 支持更早的 iOS 版本,是老项目维护的最佳选择。
    • SwiftUI: 最低支持 iOS 13。



以下是几个 iOS SwiftUI 在项目中的详细应用场景和代码示例,展示如何将 SwiftUI 用于实际开发使命,例如实现用户登录界面、API 数据加载、以及利用 Core Data 管理本地存储

1. 用户登录界面

一个简单的登录界面,包含用户名和暗码输入框,以及登录按钮。
代码示例

  1. import SwiftUI
  2. struct LoginView: View {
  3.     @State private var username: String = ""
  4.     @State private var password: String = ""
  5.     @State private var showAlert: Bool = false
  6.     var body: some View {
  7.         VStack {
  8.             Text("Welcome Back")
  9.                 .font(.largeTitle)
  10.                 .bold()
  11.                 .padding()
  12.             TextField("Username", text: $username)
  13.                 .textFieldStyle(RoundedBorderTextFieldStyle())
  14.                 .padding()
  15.             SecureField("Password", text: $password)
  16.                 .textFieldStyle(RoundedBorderTextFieldStyle())
  17.                 .padding()
  18.             Button(action: handleLogin) {
  19.                 Text("Log In")
  20.                     .frame(maxWidth: .infinity)
  21.                     .padding()
  22.                     .background(Color.blue)
  23.                     .foregroundColor(.white)
  24.                     .cornerRadius(10)
  25.             }
  26.             .padding()
  27.             .disabled(username.isEmpty || password.isEmpty)
  28.         }
  29.         .padding()
  30.         .alert(isPresented: $showAlert) {
  31.             Alert(title: Text("Login Failed"), message: Text("Invalid username or password."), dismissButton: .default(Text("OK")))
  32.         }
  33.     }
  34.     private func handleLogin() {
  35.         // Mock login validation
  36.         if username == "admin" && password == "password" {
  37.             print("Login Successful!")
  38.         } else {
  39.             showAlert = true
  40.         }
  41.     }
  42. }
  43. struct LoginView_Previews: PreviewProvider {
  44.     static var previews: some View {
  45.         LoginView()
  46.     }
  47. }
复制代码

2. 加载 API 数据并展示

从 REST API 获取数据并展示为列表。
代码示例

  1. import SwiftUI
  2. struct Post: Identifiable, Decodable {
  3.     let id: Int
  4.     let title: String
  5.     let body: String
  6. }
  7. struct PostsView: View {
  8.     @State private var posts: [Post] = []
  9.     @State private var isLoading: Bool = true
  10.     var body: some View {
  11.         NavigationView {
  12.             if isLoading {
  13.                 ProgressView("Loading...")
  14.             } else {
  15.                 List(posts) { post in
  16.                     VStack(alignment: .leading) {
  17.                         Text(post.title)
  18.                             .font(.headline)
  19.                         Text(post.body)
  20.                             .font(.subheadline)
  21.                             .foregroundColor(.gray)
  22.                     }
  23.                 }
  24.                 .navigationTitle("Posts")
  25.             }
  26.         }
  27.         .onAppear(perform: fetchPosts)
  28.     }
  29.     private func fetchPosts() {
  30.         guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { return }
  31.         URLSession.shared.dataTask(with: url) { data, _, error in
  32.             if let data = data {
  33.                 let decoder = JSONDecoder()
  34.                 if let posts = try? decoder.decode([Post].self, from: data) {
  35.                     DispatchQueue.main.async {
  36.                         self.posts = posts
  37.                         self.isLoading = false
  38.                     }
  39.                 }
  40.             } else {
  41.                 print("Error fetching posts: \(error?.localizedDescription ?? "Unknown error")")
  42.                 isLoading = false
  43.             }
  44.         }.resume()
  45.     }
  46. }
  47. struct PostsView_Previews: PreviewProvider {
  48.     static var previews: some View {
  49.         PostsView()
  50.     }
  51. }
复制代码

3. 利用 Core Data 管理本地数据

一个待服务项应用,支持新增和删除使命,团结 Core Data 实现本地存储。
代码示例

  1. import SwiftUI
  2. import CoreData
  3. struct TodoListView: View {
  4.     @Environment(\.managedObjectContext) private var viewContext
  5.     @FetchRequest(
  6.         sortDescriptors: [NSSortDescriptor(keyPath: \Todo.timestamp, ascending: true)],
  7.         animation: .default)
  8.     private var todos: FetchedResults<Todo>
  9.     @State private var newTask: String = ""
  10.     var body: some View {
  11.         NavigationView {
  12.             VStack {
  13.                 HStack {
  14.                     TextField("New Task", text: $newTask)
  15.                         .textFieldStyle(RoundedBorderTextFieldStyle())
  16.                         .padding(.leading)
  17.                     Button(action: addTask) {
  18.                         Image(systemName: "plus")
  19.                             .padding()
  20.                             .background(Color.blue)
  21.                             .foregroundColor(.white)
  22.                             .clipShape(Circle())
  23.                     }
  24.                 }
  25.                 .padding()
  26.                 List {
  27.                     ForEach(todos) { todo in
  28.                         Text(todo.title ?? "Untitled")
  29.                     }
  30.                     .onDelete(perform: deleteTasks)
  31.                 }
  32.             }
  33.             .navigationTitle("Todo List")
  34.             .toolbar {
  35.                 EditButton()
  36.             }
  37.         }
  38.     }
  39.     private func addTask() {
  40.         withAnimation {
  41.             let newTodo = Todo(context: viewContext)
  42.             newTodo.title = newTask
  43.             newTodo.timestamp = Date()
  44.             do {
  45.                 try viewContext.save()
  46.                 newTask = ""
  47.             } catch {
  48.                 print("Error saving task: \(error.localizedDescription)")
  49.             }
  50.         }
  51.     }
  52.     private func deleteTasks(offsets: IndexSet) {
  53.         withAnimation {
  54.             offsets.map { todos[$0] }.forEach(viewContext.delete)
  55.             do {
  56.                 try viewContext.save()
  57.             } catch {
  58.                 print("Error deleting task: \(error.localizedDescription)")
  59.             }
  60.         }
  61.     }
  62. }
  63. struct TodoListView_Previews: PreviewProvider {
  64.     static var previews: some View {
  65.         TodoListView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
  66.     }
  67. }
复制代码
  阐明: Todo 是 Core Data 自动生成的实体,需在 Xcode 中通过 Core Data 模型文件创建。
  
4. 利用 TabView 和导航

展示多页面应用,包含主页、搜索页和设置页。
代码示例

  1. import SwiftUI
  2. struct MainView: View {
  3.     var body: some View {
  4.         TabView {
  5.             HomeView()
  6.                 .tabItem {
  7.                     Label("Home", systemImage: "house")
  8.                 }
  9.             SearchView()
  10.                 .tabItem {
  11.                     Label("Search", systemImage: "magnifyingglass")
  12.                 }
  13.             SettingsView()
  14.                 .tabItem {
  15.                     Label("Settings", systemImage: "gearshape")
  16.                 }
  17.         }
  18.     }
  19. }
  20. struct HomeView: View {
  21.     var body: some View {
  22.         NavigationView {
  23.             Text("Welcome to the Home Page")
  24.                 .navigationTitle("Home")
  25.         }
  26.     }
  27. }
  28. struct SearchView: View {
  29.     var body: some View {
  30.         NavigationView {
  31.             Text("Search for something...")
  32.                 .navigationTitle("Search")
  33.         }
  34.     }
  35. }
  36. struct SettingsView: View {
  37.     var body: some View {
  38.         NavigationView {
  39.             Text("Adjust your preferences here")
  40.                 .navigationTitle("Settings")
  41.         }
  42.     }
  43. }
  44. struct MainView_Previews: PreviewProvider {
  45.     static var previews: some View {
  46.         MainView()
  47.     }
  48. }
复制代码

这些示例展示了 SwiftUI 的实际项目应用,如用户界面设计、网络哀求、数据管理和导航布局。
选择发起



  • 利用 SwiftUI:

    • 开发新应用,目的装备运行 iOS 13+。
    • 小型或中型项目,需求以快速开发和界面划一性为主。
    • 对未来跨平台支持有需求(macOS、watchOS 等)。

  • 利用 UIKit/Objective-C:

    • 必要兼容旧版 iOS,或者维护现有项目。
    • 对性能要求高,涉及复杂自界说 UI 或底层优化的项目。
    • 项目中依靠大量 UIKit 的第三方库。

根据项目需求选择合适的技术栈,发挥两者的优势。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表