54
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-11

こちらの記事で知った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はとても助かりました。こちらのほうがより直接的でいいかとおもいます。
(ただし、記事にも書いてある通りこの機能はいつ削除されるかわからないようです。)

54
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?