iOS 17:告别ObservableObject,迎来@Observable

news/发布时间2024/8/25 19:34:49

自iOS 17(iPadOS 17, macOS 14)之后,SwiftUI 提供了一种新的宏:@Observable
可以把它当做是 ObservableObject 的优化版。在系统版本允许的情况下,我们应该优先使用@Observable
@ObservableObservableObject更好的地方在于:

  1. 写法上更加简洁;
  2. 性能更优化。@Observable能精确到对象属性变化来更新view,也就是说,只有view读取的属性变化,才会触发view的刷新。而ObservableObject的更新是无差别的,无论view读取了ObservableObject对象的哪些属性,只要ObservableObject被视为变化,与之关联的view都会刷新。

对比修饰符

ObservableObject 搭配的修饰符有:

  1. @StateObject;
  2. @ObservedObject;
  3. @EnvironmentObject;

@Observable 搭配的修饰符有:

  1. @State;
  2. @Bindalbe;
  3. @Environment;

新的写法

代码引用自 官方示例

示例的界面层次:BookReaderApp > LibraryView > BookView > BookEditView

首先定义 @Observable对象,

@Observable class Library {var name = "sample library"var books: [Book] = [Book(), Book(), Book()] @ObservationIgnored var hello = "hello" // @ObservationIgnored 用于标记属性为不可监听。使得该属性值的变化不触发view更新。
}@Observable class Book: Identifiable {var title = "Sample Book Title"let id = UUID() 
}


如果只是想让界面及时刷新数据?

struct BookView: View {var book: Book     // 无需修饰符,view自动监听对象的属性变化var body: some View {Text(book.title)}
}

如果还想“绑定”属性,好让控件来修改属性?

struct BookView: View {@State var book: Book = Book()  // @State 修饰var body: some View {TextField("Title", text: $book.title)}
}

如果我没办法在当前View创建book对象,它是从外部传进来的呢?

struct BookView: View {@Bindable var book: Book  // @ Bindable 修饰,简直就是对象版的@Bindingvar body: some View {TextField("Title", text: $book.title)}
}

假如有个对象,多个view共用,我不想一个个传递,该怎么办呢?
不妨来一套 @State.environment(...)@ Environment 组合拳

@main
struct BookReaderApp: App {@State private var library = Library() // @State 修饰,使其能作为可绑定参数传递var body: some Scene {WindowGroup {LibraryView().environment(library) // 通过注入 .environment() 修改器注入}}
}//-----------------struct LibraryView: View {@Environment(Library.self) private var library // 通过 @Environment 修饰符读出var body: some View {                          List(library.books) { book inBookView(book: book)       }        }
}

此时,你想把@Environment变量与控件绑定,发现无法用 $读取(比如$library❌)。
解决方法就是使用@Bindable

You can use the Bindable property wrapper on properties and variables to an Observable object. This includes global variables, properties that exists outside of SwiftUI types, or even local variables.

比如:

struct TitleEditView: View {@Environment(Book.self) private var bookvar body: some View {@Bindable var book = bookTextField("Title", text: $book.title)}
}

还可以这样用:

struct LibraryView: View {@State private var books = [Book(), Book(), Book()]var body: some View {List(books) { book in@Bindable var book = bookTextField("Title", text: $book.title)}}
}

参考资料

https://developer.apple.com/forums/thread/732658
https://developer.apple.com/documentation/swiftui/bindable
https://medium.com/@jywvgkchm/transitioning-to-the-new-observable-macro-in-swiftui-8b249673ab1e

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

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

2023-2024-1 20231308 《计算机基础与程序设计》第四周学习总结

2023-2024-1 20231308 《计算机基础与程序设计》第四周学习总结 作业信息这个作业属于哪个课程 [2023-2024-1-计算机基础与程序设计]这个作业要求在哪里 2023-2024-1计算机基础与程序设计第四周作业这个作业的目标 《计算机科学概论》第4章,第5章 并完成云班课测试;《C语言程…

kafka分区与消费者配置

kafka分区与消费者配置工作当中如何计算分区与消费者数量,如何最大化利用资源,防止不必要的浪费,本文将带你计算1.基本概念回顾Kafka是一个分布式流处理平台,具有高吞吐量、可扩展性和容错性。以下是一些Kafka的基本概念:消息:Kafka是一个消息传递系统,它通过生产者将消息发…

2023 版 Java和python开发线性代数探索

目录前景提示需求分析1、初始化不需要指定矩阵的尺寸,并且可以直接传入数据。2、可以计算2x2矩阵的逆3、可以做2x2的矩阵乘法Java版本开发一、 开发详情1、开发一个子类,如图所示。2、根据问题修改子类,父类,以便真实可用解决1、初始化不需要指定矩阵的尺寸,并且可以直接传…

从零用VitePress搭建博客教程(5) - 如何自定义页面模板、给页面添加独有的className和使页面标题变成侧边目录?

接上一节:从零用VitePress搭建博客教程(4) – 如何自定义首页布局和主题样式修改? 上一节其实我们也简单说了自定义页面模板,这一节更加详细一点说明,开始之前我们要知道在vitePress中,.md的文件是可以直接编写vue的代码的。 比如我们现在来自定义一个前端网址导航页面 八…

日记

日记 2023.10.21 ​ CSP-S 比赛日, 发挥很差,前两题打的还行,在 T3 大模拟上读错了题, 浪费了接近两个半小时,最后只有最送的 15 分。 最后 T4 也没有来得及看, 遗憾离场。 ​ 回来的路上有点自闭, 感觉自己越训越菜了怎么办? 实在找不到别的理由可以推卸, 只能告诉…

STFT短时傅立叶变换的局限性分析

STFT短时傅立叶变换的局限性分析 认识到傅立叶变换的关键局限性,即:缺乏空间分辨率,或者对于时域信号,缺乏时间分辨率。了解短时傅立叶变换(STFT)背后的逻辑,以克服这一限制。认可STFT中的时间和频率分辨率之间的转换。 傅立叶变换非常善于识别时域信号f(t)的正弦分量…

kubernetes 概述

云原生是一条最佳路径或者最佳实践。更详细的说,云原生为用户指定了一条低心智负担的、敏捷的、能够以可扩展、可复制的方式最大化地利用云的能力、发挥云的价值的最佳路径。因此,云原生其实是一套指导进行软件架构设计的思想。云原生的发展 云原生是一条最佳路径或者最佳实践…

零拷贝

仅作为学习记录目录零拷贝传统拷贝mmap(内存地址映射) + writekafka生态系统组成sendfilesendfile + DMA gather copysplice + DMA copy 零拷贝 传统拷贝read:当使用read调用来读取数据,此时会将用户态转化为内核态 CPU对DMA控制器发起一个调用命令 DMA将数据从硬盘拷贝到内核…

springboot使用form标签在两个html页面之间实现界面跳转,出现405问题,但是一刷新就能出现的问题解决

问题描述 在我使用form标签的action属性实现两个html页面之间的跳转,但是出现了这样的问题:问题解决 我尝试将这一块内容去掉:然后再次尝试:页面出来啦~ 问题解决啦~~

存储管理

一、概述 1.1 地址映射(地址重定位)内存中每个存储单元都有一个编号,这个编号称为内存地址(物理地址、绝对地址)。内存地址的集合称为内存空间(物理地址空间)。用户编程所用的地址称为逻辑地址(程序地址、虚地址),由逻辑地址组成的空间称为逻辑地址空间。地址映射:把…

将linux的ip地址设置为固定ip

1.查看ip地址ifconfig 我们此时的ip地址为192.168.124.128,如果我们不设置为固定的,等下次开启时,ip地址可能会变2.编辑ens33网卡的配置信息 在窗户输入以下内容回车,进入编辑界面vi /etc/sysconfig/network-scripts/ifcfg-ens33 进入配置文件,进行修改 修改后的文件为:…

我的数据仓库与数据挖掘期末大作业重置版

这是之前已经完成的任务,原本是我的数据仓库与数据挖掘课程的作业。里面都是比较入门的东西,没什么难度。之前学这门课的时候,上了一整个学期的课,几乎都在讲解数学原理。作为数学科目挂了四门的工科蠢材,我整个学期都听得云里雾里,到了学期末的时候突然告诉我们说期末大…

2023-2024-1 20231317《计算机基础与程序设计》第四周学习总结

作业信息这个作业属于哪个课程 <班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2023-2024-1计算机基础与程序设计第四周作业)这个作业的目标 <《C语言程序设计第三章》>作业正文 ... 本博客链接 https://www.cn…

laravel:访问redis(10.27.0)

一,相关文档: https://learnku.com/docs/laravel/10.x/redis/14887 二,php代码 1,配置.env 使用默认的设置: REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 2,controller中引用:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25<?phpna…

0xGame 2023【WEEK2】Crypto全解

中间的那个人 题目信息 from secret import flag from Crypto.Util.number import * from Crypto.Cipher import AES from hashlib import sha256 from random import *p = getPrime(128) g = 2 A = getrandbits(32) B = getrandbits(32)Alice = pow(g,A,p) Bob = pow(g,B,p) k…

0xGame 2023【WEEK1】Crypto全解

Whats CBC? 题目信息 from Crypto.Util.number import * from secret import flag,keydef bytes_xor(a,b):a,b=bytes_to_long(a),bytes_to_long(b)return long_to_bytes(a^b)def pad(text):if len(text)%8:return textelse:pad = 8-(len(text)%8)text += pad.to_bytes(1,big)*…

Microservice: Service Discovery

一个服务可以拥有多个实例(Instance),每个实例会引用不同的ip地址。这种情况下,我们将无法知道应该访问哪个。所以我们就需要Discovery Service来管理这些地址。 Discovery Service的工作原理

多年没有遇到如此流畅的面试了

美东一公司的面试,有多年没有遇到如此流畅的面试了。 本来说的面试时间是 30 分钟,这个还是第一轮处于电话面试那种,但是不知道为什么最后面试整个时间都延长到了快一个小时,貌似双方都还继续沟通下,有点意犹未尽的感觉。 互相了解 通常第一轮面试的过程都是互相了解。 这…
推荐文章