@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
を利用します。