什么时候使用@State来初始化@Observable对象?

问题描述 投票:0回答:1

如果我有一个使用

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 注入到环境中,这很好地在视图之间共享数据。

swift
1个回答
1
投票

您不应该在

@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
还是其他。
	

© www.soinside.com 2019 - 2024. All rights reserved.