SwiftUIになって、Viewの再利用が容易になってきたのですが、再利用可能Viewを作るときの注意点です。
Sponsor Link
再利用可能Viewでは、@ObservedObjectは使ってはいけない
ObservedObjectは、対象モデルを全て渡せるので、非常に便利ですが、Viewがそのモデルに大きく依存してしまいます。
つまり、Viewを再利用するときに、そのモデルも再利用しなければならず、Viewの再利用が難しくなります。
例えば、以下のReuseViewを再利用してもらうためには、TargetModelも再利用しなければならず、Viewの再利用を難しくしています。
コード
class TargetModel : ObservableObject{
@Published var string:String = ""
}
struct ContentView: View {
@ObservedObject var model: TargetModel
var body: some View {
ReuseView(model: model)
}
}
struct ReuseView: View {
@ObservedObject var model: TargetModel
var body: some View {
TextField("TextField", text: $model.string)
}
}
ReuseViewを使うためには、TargetModelも再利用する必要がでてきてしまいます。
再利用可能Viewでは、@Bindingで受ける
アプリケーション固有のViewの中では、@ObservedObjectを使っていても、ReuseViewへは、@Bindingで渡すようにすると、
ReuseViewの再利用が容易になります。
コード
struct ContentView: View {
@ObservedObject var model: TargetModel
var body: some View {
ReuseView(modelString: $model.string)
}
}
struct ReuseView: View {
@Binding var modelString: String
var body: some View {
TextField("TextField", text: $modelString)
}
}
非常にシンプルなことですが、再利用のためには、重要なことです。
Viewの再利用のために、どこまでをアプリケーション固有の@ObservableObjectで管理して、どこからを@Bindingにするかは、アーキテクチャ設計のキーの1つになりそうです。
Sponsor Link