ios - 在 SwiftUI 中将 Struct 而不是 Class 作为起点有什么好处?

标签 ios swift swiftui

struct ContentView: View {
    var body: some View {
        Text("Hello World")
    }
}

struct contentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

为了将 Struct 作为起点,我们将在 View 上设计的所有 UI 都将在 Struct 内部,我们知道 Struct 是值类型,它将在堆栈中分配内存。

就内存而言,它会产生怎样的影响?

最佳答案

值类型行为是他们在 SwiftUI 中真正想要的。 SwiftUI 的灵感之一是 ReactJS 中的虚拟 DOM。

实现的关键部分是存在 UI 树的多个副本,SwiftUI 比较它们以查看发生了什么变化。例如:

  1. 生成 View 树A
  2. 渲染 View 树A到屏幕
  3. 状态变化(例如用户点击了一个按钮)
  4. 生成 View 树B
  5. 检查树 A 和 B 之间的差异,只渲染需要的部分。

生成副本对于类来说相当困难,但对于值类型则很简单。

与类相比还有其他优势,但这是主要原因。值类型(作为不可变数据结构)非常适合 SwiftUI 中使用的函数式编程模式。

关于内存,请注意结构并不比类占用更多的空间,并且认为它们只存在于堆栈中是一种误解。它们在堆栈中被分配为临时对象,但是一旦您将它们保存在某个地方(例如,一个类属性),它们就不再存在于堆栈中。

关于ios - 在 SwiftUI 中将 Struct 而不是 Class 作为起点有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57070611/

相关文章:

view - SwiftUI - 如何更改 View 的背景颜色?

ios - 使用 collectionView 制作动画水平指示器

swift - 从 XPC 服务创建 NSXPCConnection

ios - 使用 UIViewController 作为 TableView 单元格

swift - 调用中参数 'message' 缺少参数

swiftui - 如何获得 Swift UI 的水平选择器?

python - 如何在 ObjC 中声明原始二进制/十六进制数据以及如何在参数中传递它?

ios - App Store Distribution Certificate - 重命名证书公用名

ios - UINavigationBar - 改变高度/添加大按钮

javascript - 如何在 PhoneGap Javascript iOs 移动应用程序中显示警报消息?