【Swift4】Expression was too complex to be solved in reasonable time;というエラーが出た時の対処法

2020年8月29日

Swiftでは別の型同士の四則演算はできません。
基本的には型を揃えた状態での計算をしないと以下のようなエラーのなります。

Binary operator '+' cannot be applied to operands of type 'Int' and 'Float'
Binary operator '-' cannot be applied to operands of type 'Float' and 'CGFloat'
Binary operator '*' cannot be applied to operands of type 'CGFloat' and 'Double'
Binary operator '/' cannot be applied to operands of type 'Float' and 'Double'

短い計算であれば、上記のように別の型で計算しているというエラーになりますが、計算式が複雑になると以下のようなエラーになる場合があります。

Expression was too complex to be solved in reasonable time;
consider breaking up the expression into distinct sub-expressions

英訳すると「 計算が複雑すぎ、型の推論に時間がかかりました。
式を異なるサブ式に分割することを検討してください。」とのことです。

つまり、エラーなんだけど、計算式が複雑で、どの型とどの型で計算しようとしているのか詳しいエラーをだせないよ!という感じです。

Expression was too complex to be solved in reasonable time;というエラーが出た時の対処法

let a : Int = 1
let b : Float = 1.24
let c : CGFloat = 2.0
let d : Double = 3.14

//let z = a*2*3 + b/4/5 + (c+d)
// Expression was too complex to be solved in reasonable time;エラーとなる

let z = Float(a)*2*3 + Float(b)/4/5 + Float( Float(c) + Float(d))
// Float型にキャストしているのでエラーにならない

対処法は簡単で型を明示的にキャストしてあげることで防げます。
上記サンプルプログラムでは全ての変数をFloat()で明示的にキャストしています。

たったこれだけでエラーはでなくなります。