主要观点:
- 2019 年宣布 SwiftUI 时,苹果工程师强调 SwiftUI 的
View
与 UIKit/AppKit 视图不同,View
的body
属性会被任意频繁评估,导致View
也会被任意频繁初始化,所以 SwiftUI 视图应为可栈分配的结构体且构造应廉价。 - 符合
View
的结构体的生命周期与代表用户界面部分的概念性事物的生命周期无关。 - SwiftUI 属性包装器在包装值初始化器中使用
@autoclosure
参数是不良的 API 设计选择,会隐藏属性包装器自身频繁初始化的事实,影响开发者理解。 - 应避免在
View
的初始化器(不仅是body
属性)中进行昂贵的工作,忽略View
结构体的生命周期,使用生命周期修饰符(如.onAppear
或.task
)来构造昂贵对象。
关键信息:
- SwiftUI
View
的特性及与其他框架视图的区别。 @StateObject
及其自动闭包初始化器存在的问题。- 避免在
View
初始化器中进行昂贵工作的建议及原因。 - 忽略
View
生命周期的重要性及原因。 - 使用生命周期修饰符的好处。
重要细节:
- 如
struct MyParentView: View { var body: some View { MyChildView() } }
中,评估MyParentView
的body
必然会运行MyChildView
的初始化器。 - 对于
@StateObject var model = MyViewModel()
和@State var model = MyViewModel()
,StateObject
的名称易混淆行为。 - 资源获取即初始化的概念,
@State
属性的包装值每次包含视图初始化时都会被评估。
总结:SwiftUI 中 View
的特性及相关设计问题与建议,强调避免在 View
初始化器中进行昂贵工作,忽略生命周期,使用生命周期修饰符等,以提高性能和代码理解性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。