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

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


在这里插入图片描述

SwiftUI 的优势

一. 声明式编程

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

二. 实时预览(Live Preview)

  • 优势:
    • Xcode 的实时预览功能允许开发者在编写代码时立即看到界面效果,大幅提升开发效率。
    • 传统 UIKit:
      • 必须运行模拟器或真机测试,调试 UI 改动耗时较长。

三. 跨平台支持

  • 优势:
    • 一套代码可运行于 iOS、macOS、watchOS 和 tvOS,简化了多平台开发。
    • 传统 UIKit:
      • UIKit 仅支持 iOS 开发,其他平台需要使用 AppKit 等不同框架,代码难以复用。

四. 代码简洁

  • 优势:
    • SwiftUI 将 UI 和逻辑绑定在一起,通过数据驱动视图更新,减少手动代码编写。
    • 示例:
      @State private var count = 0
      
      Button("Tap me: \(count)") {
          count += 1
      }
      
      • 点击按钮后,count 的变化会自动更新界面。
    • 传统 UIKit: 需要手动更新 UILabel 的文本内容。

五. 动画和过渡更简单

  • 优势:
    • SwiftUI 提供内置的简洁动画 API。
    • 示例:
      Rectangle()
          .frame(width: isExpanded ? 200 : 100)
          .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. 用户登录界面

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

代码示例
import SwiftUI

struct LoginView: View {
    @State private var username: String = ""
    @State private var password: String = ""
    @State private var showAlert: Bool = false

    var body: some View {
        VStack {
            Text("Welcome Back")
                .font(.largeTitle)
                .bold()
                .padding()

            TextField("Username", text: $username)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()

            SecureField("Password", text: $password)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()

            Button(action: handleLogin) {
                Text("Log In")
                    .frame(maxWidth: .infinity)
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(10)
            }
            .padding()
            .disabled(username.isEmpty || password.isEmpty)
        }
        .padding()
        .alert(isPresented: $showAlert) {
            Alert(title: Text("Login Failed"), message: Text("Invalid username or password."), dismissButton: .default(Text("OK")))
        }
    }

    private func handleLogin() {
        // Mock login validation
        if username == "admin" && password == "password" {
            print("Login Successful!")
        } else {
            showAlert = true
        }
    }
}

struct LoginView_Previews: PreviewProvider {
    static var previews: some View {
        LoginView()
    }
}

2. 加载 API 数据并展示

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

代码示例
import SwiftUI

struct Post: Identifiable, Decodable {
    let id: Int
    let title: String
    let body: String
}

struct PostsView: View {
    @State private var posts: [Post] = []
    @State private var isLoading: Bool = true

    var body: some View {
        NavigationView {
            if isLoading {
                ProgressView("Loading...")
            } else {
                List(posts) { post in
                    VStack(alignment: .leading) {
                        Text(post.title)
                            .font(.headline)
                        Text(post.body)
                            .font(.subheadline)
                            .foregroundColor(.gray)
                    }
                }
                .navigationTitle("Posts")
            }
        }
        .onAppear(perform: fetchPosts)
    }

    private func fetchPosts() {
        guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { return }

        URLSession.shared.dataTask(with: url) { data, _, error in
            if let data = data {
                let decoder = JSONDecoder()
                if let posts = try? decoder.decode([Post].self, from: data) {
                    DispatchQueue.main.async {
                        self.posts = posts
                        self.isLoading = false
                    }
                }
            } else {
                print("Error fetching posts: \(error?.localizedDescription ?? "Unknown error")")
                isLoading = false
            }
        }.resume()
    }
}

struct PostsView_Previews: PreviewProvider {
    static var previews: some View {
        PostsView()
    }
}

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

一个待办事项应用,支持新增和删除任务,结合 Core Data 实现本地存储。

代码示例
import SwiftUI
import CoreData

struct TodoListView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Todo.timestamp, ascending: true)],
        animation: .default)
    private var todos: FetchedResults<Todo>

    @State private var newTask: String = ""

    var body: some View {
        NavigationView {
            VStack {
                HStack {
                    TextField("New Task", text: $newTask)
                        .textFieldStyle(RoundedBorderTextFieldStyle())
                        .padding(.leading)

                    Button(action: addTask) {
                        Image(systemName: "plus")
                            .padding()
                            .background(Color.blue)
                            .foregroundColor(.white)
                            .clipShape(Circle())
                    }
                }
                .padding()

                List {
                    ForEach(todos) { todo in
                        Text(todo.title ?? "Untitled")
                    }
                    .onDelete(perform: deleteTasks)
                }
            }
            .navigationTitle("Todo List")
            .toolbar {
                EditButton()
            }
        }
    }

    private func addTask() {
        withAnimation {
            let newTodo = Todo(context: viewContext)
            newTodo.title = newTask
            newTodo.timestamp = Date()

            do {
                try viewContext.save()
                newTask = ""
            } catch {
                print("Error saving task: \(error.localizedDescription)")
            }
        }
    }

    private func deleteTasks(offsets: IndexSet) {
        withAnimation {
            offsets.map { todos[$0] }.forEach(viewContext.delete)

            do {
                try viewContext.save()
            } catch {
                print("Error deleting task: \(error.localizedDescription)")
            }
        }
    }
}

struct TodoListView_Previews: PreviewProvider {
    static var previews: some View {
        TodoListView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
    }
}

说明: Todo 是 Core Data 自动生成的实体,需在 Xcode 中通过 Core Data 模型文件创建。


4. 使用 TabView 和导航

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

代码示例
import SwiftUI

struct MainView: View {
    var body: some View {
        TabView {
            HomeView()
                .tabItem {
                    Label("Home", systemImage: "house")
                }

            SearchView()
                .tabItem {
                    Label("Search", systemImage: "magnifyingglass")
                }

            SettingsView()
                .tabItem {
                    Label("Settings", systemImage: "gearshape")
                }
        }
    }
}

struct HomeView: View {
    var body: some View {
        NavigationView {
            Text("Welcome to the Home Page")
                .navigationTitle("Home")
        }
    }
}

struct SearchView: View {
    var body: some View {
        NavigationView {
            Text("Search for something...")
                .navigationTitle("Search")
        }
    }
}

struct SettingsView: View {
    var body: some View {
        NavigationView {
            Text("Adjust your preferences here")
                .navigationTitle("Settings")
        }
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView()
    }
}

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

选择建议

  • 使用 SwiftUI:

    • 开发新应用,目标设备运行 iOS 13+。
    • 小型或中型项目,需求以快速开发和界面一致性为主。
    • 对未来跨平台支持有需求(macOS、watchOS 等)。
  • 使用 UIKit/Objective-C:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第34天:安全开发-JavaEE应用反射机制攻击链类对象成员变量方法构造方法

时间轴&#xff1a; Java反射相关类图解&#xff1a; 反射&#xff1a; 1、什么是 Java 反射 参考&#xff1a; https://xz.aliyun.com/t/9117 Java 提供了一套反射 API &#xff0c;该 API 由 Class 类与 java.lang.reflect 类库组成。 该类库包含了 Field 、 Me…

FitDiT - 腾讯联合复旦开源的轻量版高保真虚拟试衣模型 4G显存可使用 本地一键整合包下载

FiTDiT 是腾讯和复旦大学联合推出的一种利用 DiT 的新型服装感知增强技术&#xff0c;旨在实现高保真虚拟试衣。你只需要上传一个人像图像和一个衣物图像&#xff0c;就可以生成一个展示人物穿着所提供衣物的图像。与传统的基于 U-Net 的 LDM 相比&#xff0c;FiTDiT 能够将更多…

第32天:Web开发-PHP应用文件操作安全上传下载任意读取删除目录遍历文件包含

#知识点 1、安全开发-原生PHP-文件安全操作 2、安全开发-原生PHP-上传读取删除包含等 3、安全开发-原生PHP-代码审计文件安全 本质->任意文件读取/删除/修改/上传/下载等漏洞存在的原因->本质上是存在“可控变量”来传递参数->如果过滤不严->这些可控变量原则上可通…

Swagger学习⑰——@Link注解

介绍 Link 是 Swagger/OpenAPI 3.0 注解库中的一个注解&#xff0c;用于在 OpenAPI 文档中定义链接&#xff08;Link&#xff09;。链接是一种在 API 响应中提供相关操作或资源引用的机制&#xff0c;通常用于描述操作之间的关系或提供额外的操作提示。 Link 注解的作用 Link…

TIOBE编程语言排行靠前的编程语言的吉祥物

Python的吉祥物&#xff1a;小蟒蛇 Python语言的吉祥物是一只名叫"Pythonidae"&#xff08;或简称"Py"&#xff09;的小蟒蛇。这个吉祥物由Tobias Kohn设计于2005年&#xff0c;它的形象借鉴了真实的蟒蛇&#xff0c;但加入了一些可爱和友善的特点。小蟒蛇…

浙江安吉成新的分布式光伏发电项目应用

摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

记录一次Android Studio的下载、安装、配置

目录 一、下载和安装 Android Studio 1、搜索下载Android studio ​2、下载成功后点击安装包进行安装&#xff1a; 3、这里不用打勾&#xff0c;直接点击安装 &#xff1a; 4、完成安装&#xff1a; 5、这里点击Cancel就可以了 6、接下来 7、点击自定义安装&#xff1a…

【面试】程序员 简历

一、简历整体结构 完整简历包含基本信息、教育背景、求职意向、工作经历、职业技能、项目经历、个人优势和个人荣誉八个部分。编写时&#xff0c;前几部分在保证真实的基础上可适当美化&#xff1b;个人优势和荣誉描述要突出难点亮点且避免夸张&#xff0c;可写入如马拉松参赛、…

于交错的路径间:分支结构与逻辑判断的思维协奏

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节内容很多&#xff0c;文章字数达到了史无前例的一万一&#xff0c;我们要来学习分支与循环结构中…

CentOS 7 下 Nginx 的详细安装与配置

1、安装方式 1.1、通过编译方式安装 下载Nginx1.16.1的安装包 https://nginx.org/download/nginx-1.16.1.tar.gz 下载后上传至/home目录下。 1.2、通过yum方式安装 这种方式安装更简单。 2、通过编译源码包安装Nginx 2.1、安装必要依赖 sudo yum -y install gcc gcc-c sudo…

ubuntu/kali安装c-jwt-cracker

1.下载安装包 可以去GitHub下载解压&#xff0c;我这直接在kali克隆下来了。&#xff08;网络不好可能克隆不下来&#xff09; git clone https://github.com/brendan-rius/c-jwt-cracker.git 2.如果下载的压缩包就需要进行解压&#xff0c;克隆的直接进入目录就好了。 unzi…

深入解析 Flink 与 Spark 的性能差异

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

1.1 k8s的介绍与核心对象概念

本节重点总结&#xff1a; k8s主要功能k8s核心对象 PodVolumeServiceDeploymentDaemonSetStatefulSetJob k8s架构 master和node节点master节点node节点 Kubernetes介绍 Kubernetes是Google在2014年开源的一个容器集群管理系统&#xff0c;使用Go语言开发Kubernetes也叫K8S(因…

MySQL库表的操作

目录 一、库的操作 1.1库的创建 1.2字符集和校验规则 1.2.1 查看系统默认字符集以及校验规则 1.2.2 查看数据库支持的字符集 1.2.3 查看数据库支持的字符集校验规则 1.2.4 校验规则对数据库的影响 1.3操纵数据库 1.3.1显示库 1.3.2显示创建语句 1.3.3修改数据库 1.3…

详解opencv resize之INTER_LINEAR和INTER_AREA

一。先简单介绍一下resize的用法 src&#xff1a;输入图&#xff0c; dst&#xff1a;输出图 dsize&#xff1a;输出图的宽高&#xff0c;如果dsize不为空&#xff08;即宽高都不是0&#xff09;&#xff0c;则以dsize为准进行resize。 fx, fy是放大缩小的比例&#xff0c;是…

使用uniapp 微信小程序一些好用的插件分享

总结一下自己在开发中遇见的一问题&#xff0c;通过引入组件可以快速的解决 1.zxz-uni-data-select 下拉框选择器(添加下拉框检索&#xff0c;多选功能&#xff0c;多选搜索功能&#xff0c;自定义 下拉框插件&#xff0c;使用这个的原因是因为 uniui uview 组件库下拉框太…

我喜欢的数学题

偏向抖机灵性质的&#xff0c;考察理解的&#xff0c;而不是比拼计算量的&#xff0c;可能跟现在岁数大了算不明白了多少有点关系吧。 高高手&#xff0c;别太重计算&#xff0c;给普通孩子留条路。就算将来真的理工治国&#xff0c;也没必要都往人形计算机方面引导。毕竟你未来…

潜力巨大但道路曲折的量子计算

近一年来&#xff0c;由于工作的原因参观访问了一些量子产业园&#xff0c;接触了量子加密计算机、量子云计算等非常炫酷的概念性产品&#xff0c;这与自己一直认为的“量子技术仍然处于实验室研究阶段”的基本判断与认知产生了强烈的冲突&#xff0c;一刹那间&#xff0c;心中…

电脑提示directx错误导致玩不了游戏怎么办?dx出错的解决方法

想必大家都有过这样的崩溃瞬间&#xff1a;满心欢喜打开心仪的游戏&#xff0c;准备在虚拟世界里大杀四方或者畅游冒险&#xff0c;结果屏幕上突然弹出个 DirectX 错误的提示框&#xff0c;紧接着游戏闪退&#xff0c;一切美好戛然而止。DirectX 作为 Windows 系统下游戏运行的…

设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析

状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类&#xff0c;通过状态对象的行为改变来避免…