↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > 知っててお得なLiteral達「__FILE__等」

知っててお得なLiteral達「__FILE__等」

最近仕事でphpのcron実行時にログを出す作業が多いのですが、swiftでLogを効率的に出すには どうするかと調べていると知らないことが沢山出てきました。__FILE__や__FUNCTION__等の呼び出している ファイル名や関数名を調べるLiteralがあるようです。

  • __FILE__ => 現在のファイル名
  • __LINE__ => 現在の行数
  • __COLUMN__ => 現在の列数
  • __FUNCTION__ => 現在の関数名

参考:Swift 中級編byYusei Nishiyama
参考:Swiftの自前ログクラス
参考:Building assert() in Swift, Part 2: __FILE__ and __LINE__
参考:Swiftのデバッグが捗るデバッグ関数を独自定義する

やってみた

一度実際みてみましょう。


class ViewController: UIViewController {
    
    override func viewDidAppear(animated: Bool) {
        
        testLiteral()
    
    }
    
    func testLiteral(){
        print("function: \(__FUNCTION__))")
        print("file: \(__FILE__)")
        print("line: \(__LINE__)")
        print("colmn: \(__COLUMN__)")
    }

}

以下のようなログがでます。



function: testLiteral())
file: /Users/swiftsalaryman/Documents/xcode/test/test/ViewController.swift
line: 20
colmn: 25

カスタマイズ

さて記事を読んでいるとassertの処理を利用してLogを出すサンプルが多くありましたので 実証してみました。詳しくはそれぞれの参照サイトをご確認下さい。


class ViewController: UIViewController {
    
    override func viewDidLoad() {
        let testValue = 0;
        testAssert(testValue > 0)
    }
    
    func testAssert(@autoclosure predicate : () -> Bool) {
        #if DEBUG
            if !predicate() {
                print("assertion failed at \(__FILE__):\(__LINE__)")
                abort()
            }
        #endif
    }
}

上は何をしているかというと、testAssertの引数[testValue>0]を 評価して失敗していれば"assertion failed"をエラー内容やLINEを出力してabortで終了させる。といった方法です。 if DEBUGに関しては昔書いたこちらの記事をご参照ください。 デバッグ時にだけ実行するような方法が可能です。以下の様に出力されます。(if DEBUGがONの場合ですが、 もし表示されなければ、#ifDEBUGと#endifを削除して試してください。



assertion failed at /Users/swiftsalaryman/Documents/xcode/test/test/ViewController.swift:19

ただし、こちらassertをカスタマイズするだけでは役不足です。というのも assert処理というものがすでにあるからです。


class ViewController: UIViewController {
    
    override func viewDidLoad() {
        let testValue = 0;
        assert(testValue > 0)
    }
    
}

これを実行しても以下のログが表示されます。ほとんど同じです。



assertion failed: : file /Users/swiftsalaryman/Documents/xcode/test/test/ViewController.swift, line 13

なので自作でassert処理+logを保存したり、#if DEBUGで管理したい場合はいいのかもしれません。 ログと仲良くする為のツールですね!

まとめ

サンプル画像

知らない事がまだまだ多いSwift2.0でした。Swift3.0になったら大きく変わるんだろうなぁ、、、サイトを 一新しないといけませんね

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!