「Cannot assign to property: ‘xxx’ is a get-only property」が発生する

この記事は約3分で読めます。

親Viewから渡されたプロパティを引数に使用して、@StateObjectを付与したプロパティを初期化使用とした所エラーが発生したため、解決した方法を載せておきます。

問題のあったコード

以下の構成のコードにおいて、子ビューでのinit部分でエラーが発生しプロパティの初期化が出来ずに、に困ったことがありました。

エラーの内容を見るとは、「初期化しようとしているchildmodelプロパティがget onlyのプロパティのため設定できない」という意味のようです。

//親ビュー
struct ParentView: View {
    @State var parentProperty: String
    var body: some View {
        VStack {
            ChildView(parentProperty: parentProperty)
        }
    }
}

//子ビュー
struct ChildView: View {
    @Binding var parentProperty: String
    @StateObject var childModel: sampleModel
    
    init (parentProperty: String) {
        //↓以下の行でエラーが発生する
        self.childModel = sampleModel(parentProperty: parentProperty)
    }
    var body: some View {
        Text(childModel.parentProperty)
    }
}

//モデルクラス
class sampleModel: ObservableObject{
    @Binding var parentProperty: String
    init (parentProperty: String) {
        self.parentProperty = parentProperty
    }
}

解決できた方法

エラーが発生している下記該当部分を以下のとおり置き換えることで解決できました。

StateObjectのプロパティラッパーがget onlyであるため、プロパティラッパーの本体?であるchildModel自体を初期化するようなコードにしないとダメなようです。

//self.childModel = sampleModel(parentProperty: parentProperty)
//↓のようにコードを置き換えることで解決
_childModel = StateObject(wrappedValue: sampleModel(parentProperty: parentProperty))
タイトルとURLをコピーしました