【Swift】Cannot use mutating member on immutable value: ‘self’ is immutable

またサボりぐせが出てしまって暫く更新を怠っていたのですが、ちょいちょいXcodeで遊んでいたら、見慣れないエラーにハマってしまったので解決方法を書いておこうかなと思っています。まあ、これって初歩の初歩だぜって内容なのかもしれませんが、個人的にはハマり要素だなって気もしています。

SwiftUIで遊んでみようと・・・

SwiftUIなるものが登場して・・・まあ、簡単に言うと、所謂UIをSwift(コード)で書いてしまおうぜ、って感じなんでしょうかね。ぱっとそれを聞いたときは、昔のJava Appletを思い出してしまって、なんでそんな古臭いことをまた始めたんだろうって・・・思ったのですが、まあ、ちょっと違うんでしょうね。多分。で、簡単なアプリでも作ってちょっと遊んでみようかなって、やっていたわけです。

見慣れないエラー

とりあえず、プロジェクトを作ると、ContentViewっていう構造体がデフォルトで作成されます。ここにUIのコードを書いていくらしく、まあ、手始めにそれを改修していくイメージでコードを書いて遊んでいました。するとある時、以下のようなエラーが発生してビルドエラーになるようになってしまいました。

Cannot use mutating member on immutable value: 'self' is immutable

書いたコード(エラーになる奴)

エラーになったコードは以下のような感じで・・・今回のコードは、とりあえずで書いていたため、ContentViewに何でも書いていました。イメージとしてはメンバ変数に配列を用意して、関数の中からそこに追加をする感じ。

struct ContentView: View {
    var a: [A] = []
    private func b() {
        a.append(A()) // Cannot use mutating member on immutable value: 'self' is immutable
    }
}

エラーになる理由

普通に書いていたらなんの問題もないようなコードですが・・・よくよく見ると、ContentViewってclassではなく、struct(構造体)でした。構造体ではメンバ変数は参照ではなく値で持っているとのことで、内部から書き換えることが出来ないみたいです。

解決方法

解決方法としては、比較的簡単で、「@State」って言うアノテーションをメンバ変数に付けるだけで良いようです。変数aは状態を示す変数だよって宣言する感じですかね。なんと簡単な・・・structなんてあまり使わないですからね・・・ハマってしまいました。

struct ContentView: View {
    @State var a: [A] = []
    private func b() {
        a.append(A())
    }
}

参考サイト

追記構造体(Struct)のプロパティが変更できない。mutatingが効かない。
構造体

関連記事

Swift4におけるsubstringについて

【Swift】UIViewControllerでStatic CellsのTab...

【Xcode】ERROR ITMS-90032: "Invalid Image ...

SwiftでOpenALの簡単サンプルソース

【Flutter】シミュレーターで最初のアプリを起動してみる【Mac】

【Swift】日付(Date型)同士の差の取り方