@State 的限制

Bat*_*azy 2 swift5 swiftui

我在一些文章中看到@state有很多限制

  • 我们不应该将它与复杂的模型一起使用,最好将它与简单的属性(如 string、bool 等)一起使用。
  • 我们应该在视图本身内部使用它。

我尝试制作一个结构模型并在 contentview (ParentView)中用 @state 标记它,并通过用 @binding 包装它来将该模型传递给它的子视图,它工作得很好,所以我不明白为什么我们仍然需要 @objectbinding因为我们可以将相同的值传递给这些子视图,如果一个视图发生变化,其他视图也会发生变化?或者@objectbound解决的@state有哪些限制?

kon*_*iki 5

我建议您观看WWDC 2019 会议:SwiftUI 中的数据流。这是很好解释的。它描述了在哪些场景中 @State 是完全可以接受的以及在哪些场景中需要 ObjectBinding/EnvironmentObject。课程时长只有 37 分钟,但它将是您对绑定理解的前后对比。请务必观看,从长远来看这会节省时间。

这一切都取决于了解数据的“真相来源”在哪里。视频中也解释了这个概念。简而言之,事实的来源是您的数据的诞生。如果变量的数据可以从其他变量导出,那么它就不是事实来源。

@State和 和有什么区别@BindableObject

@State:它是视图本地的。它必须是值类型(例如,struct、Int、String、Array 等),并且其存储由框架管理。

@BindableObject:它是视图外部的,它是一个参考值(例如,一个类),它的存储由您管理,使您可以更灵活地实现自己的逻辑。

请注意,@State在构建应用程序原型时,变量也很有用。例如,如果您正在处理视图的布局,您最初可以使用变量@State来使事情变得更容易。一旦您的视图满足您的要求,您就可以专注于创建@BindableObject并替换您的@State.