SwiftUI & SDK Integration
@State, ObservableObject e bridge UIKit↔SwiftUI
SDKs precisam suportar tanto SwiftUI quanto UIKit. O desafio é expor APIs que funcionem naturalmente em ambos os paradigmas — delegates para UIKit, async/await + ObservableObject para SwiftUI.
Property Wrappers de Estado
| Property Wrapper | Ownership | Tipo | Uso |
|---|---|---|---|
| @State | View possui o dado | Value types (String, Int, Bool) | Estado local da view (toggle, texto input) |
| @StateObject | View possui o objeto | ObservableObject (class) | ViewModel criado pela view |
| @ObservedObject | View observa, não possui | ObservableObject (class) | ViewModel passado como parâmetro |
| @Published | Propriedade do ObservableObject | Qualquer tipo | Notifica views quando valor muda |
| @EnvironmentObject | Injetado na hierarquia | ObservableObject (class) | Dependências compartilhadas (SDK instance) |
| @Binding | Referência a @State de outra view | Value types | Two-way binding entre parent e child |
Fluxo de Dados
| Direção | Mecanismo | Exemplo |
|---|---|---|
| Parent para Child | Init parameter / @Binding | ChildView(title: title) |
| Child para Parent | @Binding / Closure | ChildView(onComplete: { result in ... }) |
| Shared State | @EnvironmentObject | .environmentObject(sdk) |
| Async State | @StateObject + @Published | ViewModel com estados Loading/Success/Error |
Qual a diferença entre @StateObject e @ObservedObject?
@StateObject cria e possui o objeto — SwiftUI garante que a instância sobrevive a re-renders da view. Use quando a view é responsável por criar o ViewModel.
@ObservedObject apenas observa um objeto que vem de fora. Se a parent view re-renderiza, o objeto pode ser recriado (perdendo estado). Use quando o ViewModel é passado como parâmetro. Regra: quem cria usa @StateObject, quem recebe usa @ObservedObject.
@ObservedObject apenas observa um objeto que vem de fora. Se a parent view re-renderiza, o objeto pode ser recriado (perdendo estado). Use quando o ViewModel é passado como parâmetro. Regra: quem cria usa @StateObject, quem recebe usa @ObservedObject.