Xcode 16で突然 The compiler is unable to type-check this expression
というエラーに遭遇したこと、ありませんか?
何気なくコードを書いていると、ある日突然ビルドエラーが出る。しかもどこが原因なのか、すぐにはわからない…
AIに丸投げしてコピペで聞いてみても、ほぼ原因は返ってきません。
そこで、今回は私が普段このエラーの原因を特定するためにやっている手順を共有します。
結論からいうと、「怪しそうな箇所を一旦コメントアウトしていき、根気よく探して別メソッドや別ViewBuilderに切り分ける」ことで、かなり解決できることが多いです。
1. onAppear
や .onChange
の中身を順番にコメントアウトしてみる
-
onAppear { ... }
や.onChange(of: xxx) { ... }
の中には、実際にいろいろな処理が書いてあると思います。 - これを 順番にコメントアウト していってみて、どこでエラーが消えるかを確認します。
- もしコメントアウトしたタイミングでエラーが消えたなら、そのコードを別メソッド に切り分けて呼び出すようにすれば大抵解決します。
SwiftUIだと、なぜか冗長な処理が入り組んでいるときにコンパイラがタイプチェックで迷子になることがあるんですよね。
下記のように少しずつコメントアウトしていきましょう。
// onAppear {
// someComplexFunc()
// // ↑ この部分をコメントアウトしてビルド
// // 次は別の処理をコメントアウトしてビルド
// }
エラーが再現しなくなったら、該当部分を別のメソッドやファイルに分離すると割とうまくいきます。
2. VStack
や HStack
の中身を順番にコメントアウトしてみる
- もし
onAppear
や.onChange
で原因が見つからなかったら、次はVStack
やHStack
などのスタック系の中身を疑ってみましょう。 - 同様に 順番にコメントアウト してビルドし直して、いつエラーが消えるかをチェックします。
- これでどこかのViewが怪しいと分かったら、そこを 別の
@ViewBuilder
に切り分けるようにすれば解決することが多いです。
SwiftUIのViewツリーが複雑になってくると、コンパイラが「表現しきれない!」と怒ってしまうのかもしれません。
適度にViewを分割してあげるのが吉です。
こんな感じで少しずつコメントアウトして原因を探ります。
VStack {
// View1()
// View2()
// ... 順番にコメントアウトしていき、原因箇所を特定
}
3. リファクタリングで変えた変数名を再チェックする
- 最後に、これが 個人的に一番ハマるパターン です。
- 変数名やプロパティ名をリファクタリングで変更したとき、ちゃんと全部置き換わっていない可能性があります。
- 特に
@Binding
している変数や、ObservableObjectのプロパティなんかは、Xcodeのリファクタリングがうまく効かない場合があるんですよね…。 - Swift6だと@MainActor@Observableをつけたクラスのプロパティをリファクターしたときに$プロパティがうまく置き換わりません
- こうなると、意味不明なエラーが出たり、原因があちこちに隠れたりします。
- 1や2の手順をやってもなかなか解決しない場合、ほぼこれに当たっています。
一度リファクタリングすると、そのあとにさらにコードを追加してしまいがち。
気がついたときには原因箇所がたくさんある、なんてことも。
そうなる前に、@BindingやObservableObjectのプロパティ名が一致しているか をこまめに確認するのが大事です。
まとめ
The compiler is unable to type-check this expression
は、
- 関数やViewの中身が複雑になりすぎている
-
リファクタリングで名前が合わなくなっている
などで割と起こりがちです。
順番にコメントアウトして怪しいところを洗い出す
→ 別メソッド(または別View)に分割
→ リファクタリング時の変数名の整合性も再チェック
という流れで、結構な確率で解決できます。
もし同じエラーで悩んでいる方がいたら、ぜひ試してみてください。
やはり地道なアプローチが遠回りなようで一番手っ取り早いです。
以上、少しでも参考になれば幸いです!