@Bindable は @Binding の置き換えではありません。 @Bindable はProperty WrapperのProjected Value( $ )を使えるようにするためのものです。@Observable class Book: Identifiable { var title = "Sample Book Title" var isAvailable = true } struct BookEditView: View { @Bindable var book: Book @Environment(\.dismiss) private var dismiss var body: some View { Form { TextField("Title", text: $book.title) Toggle("Book is available", isOn: $book.isAvailable) Button("Close") { dismiss() } } } }
BookEditView 自体においては Book が @Bindable である必要はありません。もし book のプロパティが変更されれば BookEditView は再レンダリング( body が再実行)されますし、 BookEditView の中で book のプロパティを変更すれば、 BookEditView に book を渡した元の View 等にも反映されます。TextField("Title", text: $book.title) のように、 book のプロパティをさらに先の View に渡そうとするときに困ります。もし let book: Book だと( Book はクラスなので、Property Wrapper( @Bindable 等)を使わないのであれば var である必要がありません。単に let book: Book としても、 @observable なクラスのプロパティの更新は追跡され、再レンダリングされます)、 $ を使うことができません。 (edited)TextField("Title", text: Binding( get: { book.ttile }, set: { book.title = $0 } )) と書くことになってしまいます。$ が使えるように @Bindable を利用します。