SwiftUI 5: обновления объектов @Observable без использования оболочек свойств, State и Bindable
У меня есть следующееSwiftUI 5
фрагмент кода с использованиемXCode 15 beta 4
:
struct ContentView: View {
var person: Person = .init(id: UUID(), name: "Stacey")
//using @State or @Bindable or nothing before 'person' does the same job
var body: some View {
VStack {
Button {
person.name = "Sarah"
} label: {
Text("change name")
}
Text("Name: \(person.name)")
}
}
}
@Observable
class Person: Identifiable {
var id: UUID
var name: String
init(id: UUID, name: String) {
self.id = id
self.name = name
}
}
Интересно, в чем разница между использованием:@Bindable
,@State
, или ничего передPerson
переменная вContentView
, посколькуperson
объект успешно обновляется, используя любой из этих трех вариантов, и представление может прослушивать новые изменения.
2 ответа
С@Observable
теперь вы можете видеть изменения повсюду, когда вы их испытываете.
@Bindable
это внести изменения, вы можете использовать$someObject.someProperty
и изменить свойство объекта.
@State
является источником истины для местных объектов недвижимости.
//используем @State или @Bindable или ничего, прежде чем 'person' выполнит ту же работу
Это потому, что вы отметили свой классPerson
какObservableObject
посредством подачи заявки@Observable
перед объявлением класса. Из-за этого ваш экземпляр,person
всегда будет отслеживать обновления независимо от каких-либо дополнительных аннотаций, которые вы предоставляете на свой взгляд.
Обычно вы используете его, когда хотите отслеживать незначительные изменения переменной ненастраиваемого класса (например, логического значения, строки, целого числа и т. д.).@Bindable
можно использовать аналогично@State
за исключением того, что более полезно применить его к инициализатору пользовательского представления в вашем основном представлении. См. следующий пример.
struct PrimaryView: View {
@State var updateCustomView: Bool = false
var body: some View {
CustomView(shouldUpdate: $updateCustomView)
}
}
struct CustomView: View {
@Bindable var shouldUpdate: Bool
var body: some View {
if shouldUpdate {
// do stuff
}
}
}