Avatar
Avatar
xsuiyoku
こんばんは、swiftuiを久しぶりに触った者です @ObservableはObservableObjectの完全な置き換えで、bindingが必要なところは@Bindableに置き換えるという認識であってますか?
僕も最初勘違いしていたのですが、 @Bindable@Binding の置き換えではありません。 @Bindable はProperty WrapperのProjected Value( $ )を使えるようにするためのものです。
2:33 PM
たとえば、リファレンス https://developer.apple.com/documentation/swiftui/bindable の例では、 @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 のプロパティを変更すれば、 BookEditViewbook を渡した元の View 等にも反映されます。
2:36 PM
しかし、 TextField("Title", text: $book.title) のように、 book のプロパティをさらに先の View に渡そうとするときに困ります。もし let book: Book だと( Book はクラスなので、Property Wrapper( @Bindable 等)を使わないのであれば var である必要がありません。単に let book: Book としても、 @observable なクラスのプロパティの更新は追跡され、再レンダリングされます)、 $ を使うことができません。 (edited)
2:36 PM
その場合は、 TextField("Title", text: Binding( get: { book.ttile }, set: { book.title = $0 } )) と書くことになってしまいます。
2:37 PM
これが面倒なので、 $ が使えるように @Bindable を利用します。