扫码阅读
手机扫码阅读
【SwiftUI】2.特性之-@State属性包装器

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

程序员华仔
扫码关注公众号
属性包装器概述
继介绍不透明返回类型之后,本篇文章主要探讨属性包装器(PropertyWrapper),并对其与属性代理(PropertyDelegate)进行区别。属性包装器和属性代理本质上是相同的概念,但属性代理是在Swift 5.0版本提出的,而从Swift 5.1版本开始统一称为属性包装器。本文将统一使用属性包装器这一称呼。
属性包装器现象
在Xcode项目中,我们常会遇到如@State、@StateObject等标识,它们都是属性包装器的例子。在SwiftUI中,存在多个属性包装器,每个都有其独特的含义和作用。
属性包装器罗列
以下是一些常用的属性包装器:
- @State
- @StateObject
- @Binding
- @BindableObject
- @Published
- @ObservedObject
- @EnvironmentObject
文章以@State为例来分析属性包装器的内部实现原理。
@State的内部实现原理
State的源码揭示了几个关键点:
- 使用@propertyWrapper修饰的结构体。
- 提供init方法以支持声明时赋值。
- 计算属性的使用,最终通过wrappedValue方法来获取和设置值。
- 返回Binding类型的值,并遵守BindingConvertible协议,实现属性绑定。
- 遵守DynamicViewProperty协议,实现动态绑定视图和属性。
以上特性共同支持@State属性的绑定和动态监听。
进一步的探考
属性包装器如@State实现绑定和监听的机制基于Swift的Combine框架,该框架基于观察者模式和响应式编程。观察者模式用于维护对象间一对多的依赖关系,确保一个对象的变化能够自动通知依赖者。响应式编程则处理异步数据流及变化,将事件转换成数据流,方便进行操作和处理。
总结
属性包装器的使用目的是为了解决用户交互或数据变化时,界面的及时更新。通过数据源与视图的绑定,在数据变化时通知SwiftUI重新绘制界面,避免不必要的全局绘制和资源浪费。
想要了解更多内容?

程序员华仔
扫码关注公众号
程序员华仔的其他文章
加入社区微信群
与行业大咖零距离交流学习


PMO实践白皮书
白皮书上线
白皮书上线