[SwiftUI] 再利用できるViewにするために@ObservedObjectではなく、@Bindingを使う

SwiftUI

     

TAGS:

⌛️ < 1 min.

SwiftUIになって、Viewの再利用が容易になってきたのですが、再利用可能Viewを作るときの注意点です。

再利用可能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つになりそうです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です