Se eu tiver uma classe de repositório usando Observable
uma macro como esta:
@Observable class TaskRepository {
var number: Int = 0
var isCompleted: Bool = false
}
E eu quero acessar o repositório dentro do meu modelo de visualização: Que também usa um @Observable
aqui porque eu quero que o SwiftUI redesenhe a visualização sempre que algo for atualizado...
// with @State
@Observable class CardViewModel{
@State private var taskRepository = TaskRepository()
var title: String = "Name"
// view model do some processing...
}
Devo usar @State
para inicializar o repositório? porque também posso fazer isso:
// without @State
@Observable class CardViewModel{
private var taskRepository = TaskRepository()
var title: String = "Name"
// view model do some processing...
}
Alguém pode me ajudar a entender quando devo considerar @State
? Meu entendimento é que usá- @State
lo me permite injetar o TaskRepository em um ambiente, o que é bom para compartilhar os dados entre as visualizações.
Você não deve usar
@State
em@Observable
aulas.O objetivo de
@State
é permitir que o SwiftUI gerencie os armazenamentos das propriedades em uma struct controlada pelo SwiftUI, efetivamente dando a elas um "comportamento semelhante ao tipo de referência". Observe como você pode definir@State
s para novos valores em aView.body
mesmo quebody
não sejamutating
.Isso só funciona em certos tipos.
App
s,Scene
s,ViewModifier
s, e estilos de visualização comoButtonStyle
são alguns tipos onde isso funciona, de cabeça. O SwiftUI é projetado para procurar por@State
s em tipos que implementam esses protocolos e alocam armazenamento para eles.@Observable
classes já referenciam tipos, então elas não precisam de@State
, e o SwiftUI não foi projetado para trabalhar com@State
. Mas mesmo antes disso, a@Observable
macro não foi projetada para manipular nenhum wrapper de propriedade no corpo da classe , e ela se expandiria para algo muito inválido. Seu código nem será compilado.Por fim,
@State
não tem nada a ver com injetar objetos no ambiente. Você pode injetar@Observable
objetos no ambiente usandoenvironment(_:)
, independentemente de ser a@State
ou algo assim.