Edited at

コンパイルに時間がかかるSwiftのコードへWarningを発生させる

More than 1 year has passed since last update.

こちらの記事で知ったTipsなのですが、簡単に設定できたためしぇあーさせていただきます。

ここでやっている内容は、Xcode8.1, Swift3.0.1環境で試しました。


やり方

以下の設定をするだけです。

プロジェクトファイルの Target -> Build Settings -> Other Swift Flags-Xfrontend-warn-long-function-bodies=100を設定します。

スクリーンショット 2016-12-11 15.23.52.png

すると100ms以上の時間がかかるメソッドはコンパイル時にWarning表示されるようになります(-warn-long-function-bodiesの値はmsで任意の値を設定します)。


やってみた

Swift2.2環境下で時間のかかる記述方法をまとめてくれている、以下の記事を参考に試してみました。

以下のような重たくなる可能性があるメソッドを持つViewControllerを用意しました。

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

nilCoalescingOperator()
ternaryOperator(val: true)
castingCGFloatToCGFloat()
}

/// ??でコンパイルに時間がかかるパターン
func nilCoalescingOperator() {
let val: CGFloat? = 10
_ = CGSize(width: 10 + (val ?? 0) + (val ?? 0) + 22, height: 10)
}

/// 3項演算子で時間がかかるパターン
func ternaryOperator(val: Bool) {
_ = val ? (1...5).map{ "\($0)" } : (0...2).map{ "\($0)" }
}

/// 型変換で時間がかかるパターン
func castingCGFloatToCGFloat() {
_ = CGFloat(M_PI) * (CGFloat((1 + 1 + CGFloat(1 + 1) / 60) * 5) - 15) * 1 / 180
}
}

すると、Warningが表示されるようになりました。閾値以上の時間がかかるメソッドに対して、どのくらい時間がかかったかも表示されていました。(castingCGFloatToCGFloat()は閾値を超えることがなかったため、Warningは発生しませんでした)

スクリーンショット 2016-12-11 16.09.47.png

SwiftLintで特定の実装パターンを弾くようにしたほうがいいのかなぁと考えていたところだったので、このTipsはとても助かりました。こちらのほうがより直接的でいいかとおもいます。

(ただし、記事にも書いてある通りこの機能はいつ削除されるかわからないようです。)