本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容。

Eul 是一款 SwiftUI & Combine 教程 App(iOS、macOS),以文章(文字、图片、代码)配合真机示例(Xcode 12+、iOS 14+,macOS 11+)的形式呈现给读者。笔者意在尽可能使用简洁明了的语言阐述 SwiftUI & Combine 相关的知识,使读者能快速掌握并在 iOS 开发中实践。

常用属性包装器

SwiftUI 提供了许多的属性包装器(Property Wrapper),极大简化了我们的工作。属性包装器,实际上是对声明的属性做了一层封装,在内部实现了一些我们看不见的操作。

下面会在概念和使用上简介 SwiftUI 中常用的属性包装器,不在代码层面做具体演示。更详细的内容可以参见我的两篇文章:

@State

在当前 View 中声明,通常使用 private 修饰,当修饰的属性值改变时,界面会随之更新。

@Binding

接收从外部对象传入的绑定值,同时可以将属性的变化回传给外部对象,即数据是双向绑定的。如 A 的属性 @State private var value: String 传入 B 的属性 @Binding var value: String ,当 B 中的 value 值改变时, A 的 value 也会更新。

@Environment

访问预设的环境变量,如系统的暗黑模式、时区等。

@ObservedObject、@Published

@ObservedObject 可以修饰遵循 ObservableObject 协议的 class 对象,该对象实例中的属性可以使用 @Published 修饰。当使用 @Published 修饰的属性值发生改变时,所有使用 @ObservedObject 修饰的对象实例,都会更新相应的值,通常用于在多个界面之间同步数据和状态。

@StateObject

与 @ObservedObject 一样,@StateObject 修饰的对象同样是遵循 ObservableObject 协议的 class 对象。但是区别在于,@StateObject 修饰的对象只会在所属的 View 中创建一次并在 View 的生命周期内存储相应的状态,而 @ObservedObject 修饰的对象会随着 View 的重绘生成新的对象,不会在 View 的生命周期内存储该对象的状态。

@EnvironmentObject

@EnvironmentObject 修饰的对象同样需要遵循 ObservableObject 协议,与 @ObservedObject 功能类似,但是它有着更强大的功能,子视图可以直接获取父视图注入的环境变量。比如,我们有视图 A、B、C,A 包含 B,B 包含 C,如果我们使用 @ObservedObject 来传递变量,需要从 A 传入 B,再从 B 传入 C,C 才能获取到对应的变量。而 @EnvironmentObject 无需如此繁琐,我们直接通过父视图 A 注入环境变量,视图 C 就可以获取注入的变量,省去中间的传递过程。

@AppStorage

等同于 Userdefaults。

@SceneStorage

用于多窗口模式,相当于为每个场景持久化了一个场景值,每个场景只能读取该场景持久化的值。当场景销毁时,该值也会销毁。建议存储轻量的、不敏感的数据

@UIApplicationDelegateAdaptor

用来调用 AppDelegate 中的生命周期方法。

自定义属性包装器

使用属性包装器可以使我们的代码精简,那么如何根据需求自定义呢?

自定义的属性包装器需要使用 @propertyWrapper 声明,并且必须有一个名为 wrappedValue 的属性。例如下面的代码,通过 CNNumber 这样一个属性包装器,可以将字符串中的阿拉伯数字转化成中文数字:

@propertyWrapper
struct CNNumber {
private let table = [
"0" : "〇",
"1" : "一",
"2" : "二",
"3" : "三",
"4" : "四",
"5" : "五",
"6" : "六",
"7" : "七",
"8" : "八",
"9" : "九",
] private var value = "" var wrappedValue: String {
get { value }
set { value = convertToCNNumbers(newValue) }
} init(wrappedValue: String) {
self.wrappedValue = wrappedValue
} func convertToCNNumbers(_ string: String) -> String {
var res = ""
for v in string {
res += table[String(v)] ?? ""
}
return res
}
}

然后我们定义一个 Person 结构体,使用 CNNumber 去修饰 birth 属性,调用时正如示例所示,它被转换成了中文数字。

struct Person {
var name: String
@CNNumber var birth: String
} struct ContentView: View {
private let p = Person(name: "Steve Jobs", birth: "1955年2月24日") var body: some View {
Text(p.birth)
}
}

本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容。

SwiftUI 简明教程之属性包装器的更多相关文章

  1. SwiftUI 中一些和响应式状态有关的属性包装器的用途

    SwiftUI 借鉴了 React 等 UI 框架的概念,通过 state 的变化,对 View 进行响应式的渲染.主要通过 @State, @StateObject, @ObservedObject ...

  2. SwiftUI 简明教程之指示器

    本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程 App(iOS.macOS),以文章(文字.图片. ...

  3. SwiftUI 简明教程之自定义 Modifier

    本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程 App(iOS.macOS),以文章(文字.图片. ...

  4. SwiftUI 简明教程之文本与图片

    本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程类 App(iOS.macOS),以文章(文字.图片 ...

  5. Python 简明教程 --- 22,Python 闭包与装饰器

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 当你选择了一种语言,意味着你还选择了一组技术.一个社区. 目录 本节我们来介绍闭包与装饰器. 闭包与 ...

  6. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

  7. Python 简明教程 --- 20,Python 类中的属性与方法

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...

  8. grootjs 简明教程

    grootJs简明教程 mvvm框架也是解决的一类问题,在某些时候会提高生产效率: 经过接近一个月的努力,grootJs测试版终于发布了 grootJs是一个mvvm的框架,名字取 grass 和ro ...

  9. Lisp简明教程

    此教程是我花了一点时间和功夫整理出来的,希望能够帮到喜欢Lisp(Common Lisp)的朋友们.本人排版很烂还望多多海涵! <Lisp简明教程>PDF格式下载 <Lisp简明教程 ...

随机推荐

  1. 使用 Elastic 技术栈构建 Kubernetes全栈监控

    以下我们描述如何使用 Elastic 技术栈来为 Kubernetes 构建监控环境.可观测性的目标是为生产环境提供运维工具来检测服务不可用的情况(比如服务宕机.错误或者响应变慢等),并且保留一些可以 ...

  2. 解决跨域问题chrome浏览器插件

    https://www.crx4chrome.com/crx/53489/ 解决chrome浏览器跨域的问题

  3. MySQL提升笔记(3)日志文件详解

    在MySQL数据库和InnoDB存储引擎中,有很多种文件,如:参数文件.日志文件.socket文件.pid文件.MySQL表结构文件.存储引擎文件. 本节重点关注日志文件,MySQL的复制.事务等重要 ...

  4. 集群部署时的分布式session如何实现?

    session是啥?浏览器有个cookie,在一段时间内这个cookie都存在,然后每次发请求过来都带上一个特殊的jsessionid cookie,就根据这个东西,在服务端可以维护一个对应的sess ...

  5. Unlink学习总结

    Unlink 本文参考了CTF-wiki 和glibc 源码 原理: 我们在利用 unlink 所造成的漏洞时,其实就是借助 unlink 操作来达成修改指针的效果. 我们先来简单回顾一下 unlin ...

  6. 浅入Kubernetes(6):CKAD认证中的部署教程

    目录 预设网络 kubeadm 安装 k8s 配置 calico 自动补全工具 状态描述 目前为止,笔者已经写了 5 篇关于 k8s 的文章,这一篇笔者将介绍 CKAD 认证官方课程中,如何部署 k8 ...

  7. sql指令,增,删,查,改

    增 insert into table (name,sex,age) value('张三','男','20')   向表中的name,sex,age,分别添加张三,男,20的内容 查 select  ...

  8. git平时用到的仓库

    github茫茫仓库 若水三千,取一瓢饮 doocs/technical-books doocs/leetcode lepture/editor pandao/editor.md 未完..待续!!积累 ...

  9. OAuth2(未完待续)

    一.OAuth2是什么?OAuth2解决了什么问题 1.OAuth2是第三方授权协议,用于支撑认证和授权 2.OAuth2中的角色划分: 资源拥有者 客户端 资源服务器 授权服务器 二.OAuth2怎 ...

  10. .NET 5学习笔记(12)——WinUI 3 Project Reunion 0.5

    2021年3月的时候,Win UI 3终于来到了第一个稳定的支持版本,可用于创建发布到Micosoft Store的应用.据某软的说法,这个叫WinUI 3 Project Reunion 0.5的版 ...