“The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions”
アプリを作っていたらこんなエラーが出てきました。
このエラーは、「この表現はコンパイルに時間がかかりすぎるから、もうちょっと分かりやすく書いて」というものです。
私が解決できた方法を紹介します。
原因
まず、私のコードの原因は、「if文の条件分岐が多かったこと」でした。
if score <= 11 {
VeryLowView()
} else if score <= 22{
LowView()
} else if score <= 33 {
AverageView()
} else if score <= 44 {
HighView()
} else if score <= 55 {
VeryHighView()
}
if文の条件分岐が多くなると、コンパイラが解読するのが大変になってしまい、結果エラーが出るのです。
「どのくらいの条件分岐からエラーが出るのか?」
を調べてみたのですが、大体4つ目ぐらいから怪しくなってきます。
なので、ifの条件分岐は3つのぐらいに収まるようにすればいいでしょう。
switch文

条件分岐が多すぎるのは、switch文を使うことで解決しました。
今回のは、コンパイラ自体が理解に時間がかかりすぎて、起こるエラーです。
「if文の条件分岐が多ければ、switch文で書いた方がいい」
というのは正しいのですが、実はswitch文はコンパイルにかかる時間も短くなるのです。
なので、今回のエラーは、if文をswicth文に書き換えれば解決できます。
以下は先程のエラーが出たコードを書き換えた例です。
switch score {
case 0...11:
VeryLowView()
case 12...22:
LowView()
case 23...33:
AverageView()
case 34...44:
HighView()
case 45...55:
VeryHighView()
default:
AverageView()
}
内容自体は同じコードですが、エラーが出ませんでした。
まとめ
“The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions”
もし、このエラーを出していたコードがif文で複数の条件分岐をしていたなら、swicth文に切り替えてみて下さい。
コンパイラが理解しやすくなり、エラーが解消されるかもしれません。
コメント