Binding
はそんな感じです。 Binding
自体は全く特殊な型ではなく、 @Binding
なプロパティが変更されても body
を再実行するような機能も持ちません。ただ get
と set
を持つだけです。@Binding
なプロパティが変更されたときにそのViewの body
が再実行されるのは、 Binding
を渡した側のViewで body
が再実行され、それに伴って渡された側の View
も更新されるからです。struct FooView: View { @State var user: User var body: some View { Checkbox(isOn: $user.isPublic) } } struct Checkbox: View { @Binding var isOn: Bool var body: some View { Button { isOn.toggle() } label: { Image(isOn ? "Checkbox-On" : "Checkbox-Off") } } }
とした場合、 user.isPublic
が更新されるとそれを @Binding
で保持する Checkbox
の body
が再実行されるのではなく、 user
を @State
で保持する FooView
の body
が再実行されます。その結果として、 Checkbox(isOn: $user.isPublic)
が新しい isPublic
に対して実行され、 Checkbox
が更新されます。