こんなコード書いたらコンパイルがめっちゃ遅くなったよって話(2020.03.25投稿記事の転載)

こんなコード書いたらコンパイル時にCPUが悲鳴をあげたというお話。

個人的に好みではないけど、swift は型推論により変数型を指定しなくても、コンパイラ?側で代入された値によって自動的に判別してくれる。

そこで厄介なのが、代入を行う際に左辺値と右辺値の型を全て統一する必要があること。
要は、左辺値がDouble型なら、右辺値も、計算式の定数および変数も全部含めて全てDouble型に統一しないといけない。

なので、型ごとに型変換する関数があり、それを使って統一していく。

Double( 変数 or 定数 ) 

とか

Int( 変数 or 定数 )

的な感じ。


で、viewの座標変換するために下のようなコードを書いたら、コンパイル時にファンが唸りはじめ10秒くらい経ってからエラーを吐くようになった。
(エラーの詳細は忘れました(゚ω゚))

rect.origin.x = x_position + (64.0 * CGFloat(col)) +(10.0 * CGFloat(col))

↓のようなコードにすることで解決

rect.origin.x = x_position + CGFloat(64.0 * CGFloat(col)) + CGFloat(10.0 * CGFloat(col))
CGFloat型はその名の通りFloatなので定数値を 64.0 と書けばOKかな?って思ってたけど、ダメだった。

Macが気の毒になるくらいコンパイル頑張ってたので、今後気をつけます。

ちなみに 定数値を使う場合、 64 は Int型、64.0 はDouble型として判断されます。
Floatを使いたい場合は、明示的に型を定義する必要があります。

とここまで書いて、Double型(10.0)とCGFloat型の掛け算したからエラーを吐いたと気づく
センスも才能もないダメプログラマーです。

コメント

このブログの人気の投稿

【python】PySide6 におけるウィンドウとかダイアログボックス内のアイテムの自動調整

脆弱性評価システムを作る〜CVSSとは〜

dict型オブジェクトを内包するlistオブジェクトのコピー