SwftUIでambiguous reference to member ~というエラーが出るときにまず試したいこと
https://waarumstudy.blogspot.com/2020/02/swftuiambiguous-reference-to-member.html
エラーの内容
SwiftUIでEnvionmentObjectのプロパティにアクセスする複雑なViewを作っていたら「ambiguous reference to member ~」というエラーが出てかなり困りました。
解決法
やることは単純です。データへのアクセスを書き直すのが面倒ですが…
まず、エラーが出ているViewを抜き出して、新しいSwiftファイル上で名前をつけて単独のViewとして書き直します(このViewを子Viewとします)。このままだと元のView(親Viewとします)で使っていた変数にアクセスできなくなるのでコードが真っ赤になると思います。
そこで、新しくObservableObjectプロトコルに適合したClassを作ります。
@Publishedをつけて必要な変数をプロパティとして宣言します。子Viewの中に@EnvironmentalObjectをつけて先程のClassのインスタンスを宣言します。
後は警告の出ている変数の名前を「インスタンス名.プロパティ名」に書き換えます(⌥+⌘+Fで置換すると速いです)。親Viewで使っている変数も同様に書き換えます。
親View内の、もともと子Viewが書かれていた場所に新しく作った子Viewの名前を書いてあげれば見た目は元通りです。
理屈
「ambiguous reference to member ~」はXCodeのコンパイラがコードを上手く読み取れないときに表示されます。
読み取れない原因は恐らくコードの階層が複雑化しすぎていることです。
そのため、階層が深い部分を取り出して単独のViewにしてやるとコードの構造が明確になってエラーが消えると考えられます。
上記の方法でうまく行ったのであながち間違ってはいないと思います。
上記の方法でうまく行ったのであながち間違ってはいないと思います。
(画像提供:Swift icon icon by Icons8)