@State 的限制

Limitation Of @State

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

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

我推荐你看WWDC 2019 session: Data Flow in SwiftUI。解释得很好。它描述了在哪些情况下 @State 是完全可以接受的,在哪些情况下 ObjectBinding/EnvironmentObject 是必要的。 session 只有 37 分钟长,但它将成为您理解绑定的前后对比。请务必观看,它将节省漫长的时间 运行。

这一切都归结为了解数据的 "source of truth" 在哪里。视频中也解释了这个概念。简而言之,事实的来源是您的数据诞生的地方。如果您的变量的数据可以从其他变量中导出,那么它不是真实来源。

@State@BindableObject有什么区别?

@State:它是局部视图。它必须是 value-type(例如,结构、Int、String、Array 等)并且其存储由框架管理。

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

请注意,@State 变量在制作应用程序原型时也非常有用。例如,如果您正在处理视图的布局,您可以先使用 @State 变量来简化操作。一旦您的视图完成了您想要的操作,您就可以专注于创建您的 @BindableObject 并替换您的 @State.