Open1

Xcode: Swift Macroの残骸が残る場合の対処

kabeyakabeya

Xcode 15から、Swift Macroの仕組みが導入され、SwiftUIのプレビューは#Previewと書くだけで従来のプレビューのコードが自動生成されるなど、非常に便利になりました。

ですが、このマクロが自動生成したコードがどこかに残ってしまって、あとでマクロの使用箇所を削除してもXcodeでエラーが出続けるというケースがあります。
具体的に私が遭遇したケースでは、#Previewでプレビューを作っていたのだけど、@ObservedObjectとか@Bindingとかが増えた結果、プレビュー側にも追加のコードをいちいち書かなければプレビューされないんで、いっそプレビューを削除する、という場合で、#Previewを削除する直前に出ていたエラーがずっと残るというケースです。

なにがしかの中間ファイルに、削除する直前の状態のマクロ展開結果が残っているのだろうと想像するのですが、

  • 中間生成ファイルができるはずの~/Library/Developer/Xcode/DerivedData/プロジェクト固有フォルダを検索したのですが見つからず。
  • Clean Build Folderを実行しても残り続ける。
  • Clear All Issuesでエラーをいったん消しても、リビルドすると再びエラーになる。

ググってもそれらしい話はなく、どうしたものかと悩みました。

色々やってみた結果、今のところの解決策は以下です。

  • エラーが起こっているビューの#Previewを再度作る。
  • もし@ObservedObjectとか@Bindingとかがたくさんあって#Previewをエラーなく作るのが大変な場合、本当のビューはコメントアウトして、同じ名前のダミーのビューを作り、とりあえずエラーなく#Previewがコンパイルされるようにする。
  • いったん全部がBuild Succeededになったら、改めて#Previewを削除する。
  • そのあと、もしダミーのビューに置き換えていたなら元に戻す。

追記:なんか、何回かリビルドしていると、復帰、つまり#Previewが記載されているかのような動きに戻ってしまいます。
どうにも回避できません。
いったん#Previewが書かれてしまうと、削除してもずっと残るということでしょうか。新規ビュー作成時のひな形に#Previewが含まれているので、新規ビュー作成時に、ビューじゃないSwiftファイルのひな形を選ばない限りは逃れられない気がします。