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
         }
     }
}
Другие вопросы по тегам