如果我有一个使用
Observable
宏的存储库类,如下所示:
@Observable class TaskRepository {
var number: Int = 0
var isCompleted: Bool = false
}
我想访问视图模型中的存储库: 这里也使用了
@Observable
,因为我希望 SwiftUI 在更新内容时重新绘制视图...
// with @State
@Observable class CardViewModel{
@State private var taskRepository = TaskRepository()
var title: String = "Name"
// view model do some processing...
}
我应该使用
@State
来初始化存储库吗?
因为我也能做到:
// without @State
@Observable class CardViewModel{
private var taskRepository = TaskRepository()
var title: String = "Name"
// view model do some processing...
}
任何人都可以帮助我了解我何时应该考虑
@State
?我的理解是通过使用 @State
它允许我将 TaskRepository 注入到环境中,这很好地在视图之间共享数据。
您不应该在
@State
课程中使用 @Observable
。
@State
的目的是允许 SwiftUI 管理 SwiftUI 控制的结构中属性的存储,有效地为它们提供“类似引用类型的行为。注意如何将 @State
设置为 中的新值View.body
即使 body
不是 mutating
。
这只适用于某些类型。
App
s、Scene
s、ViewModifier
s 以及像 ButtonStyle
这样的视图样式是可以使用的一些类型,我的脑海中浮现出这样的效果。 SwiftUI 旨在寻找实现这些协议的类型中的 @State
并为其分配存储空间。
@Observable
类已经引用类型,因此它们不需要 @State
,并且 SwiftUI 并非设计用于使用 @State
。但即使在此之前,@Observable
宏也不是为了处理类主体中的任何属性包装器而设计的,并且它会扩展为非常无效的东西。你的代码甚至无法编译。
最后,@State
与向环境中注入对象无关。您可以使用
@Observable
将
environment(_:)
对象注入到环境中,无论它是 @State
还是其他。