リリースバージョンiOSSwiftのprintln()を削除します


84

println()デバッグビルドを使用していない場合、Swiftコード内のすべての呼び出しをグローバルに無視したいと思います。このための強力なステップバイステップの説明が見つかりません。ガイダンスをいただければ幸いです。これをグローバルに行う方法はありますか、それともすべてprintln()#IF DEBUG/#ENDIFステートメントで囲む必要がありますか?



6
印刷はデバイスコンソールでは出力されなくなりましたが、デバッガコンソールでは出力されます。したがって、リリースバージョンで削除する必要はありません。
アニッシュParajuli 웃

1
Xcode8およびswift3の時点では、リリースモードのコンソールに印刷が表示されません。
CiNN 2016

回答:


101

最も簡単な方法は、Swiftの前に独自のグローバル関数を配置することですprintln

func println(object: Any) {
    Swift.println(object)
}

ロギングを停止するときは、その関数の本体をコメントアウトしてください。

func println(object: Any) {
    // Swift.println(object)
}

または、条件付きを使用して自動化することもできます。

func println(object: Any) {
    #if DEBUG
        Swift.println(object)
    #endif
}

EDITでスウィフト2.0printlnに変更されますprint。残念ながら、現在は可変個引数の最初のパラメーターがあります。これはすばらしいですが、Swiftには「スプラット」演算子がないため、コードで可変個引数を渡すことができないため、簡単にオーバーライドできないことを意味します(文字通りにのみ作成できます)。ただし、通常の場合のように、1つの値のみを出力する場合に機能する縮小バージョンを作成できます。

func print(items: Any..., separator: String = " ", terminator: String = "\n") {
    Swift.print(items[0], separator:separator, terminator: terminator)
}

Swift 3では、最初のパラメーターの外部ラベルを非表示にする必要があります。

func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    Swift.print(items[0], separator:separator, terminator: terminator)
}

3
素晴らしい解決策、ありがとう。iOS(OS Xでprintln()はない)では、リリースモードでは実行されないと言われています。
Nate Birkholz 2015年

13
@NateBirkholzいいえ、それはナンセンスです。(確認のためにテストした後、彼は言った!)
マット2015年

swift 2では、関数の名前がprintに変更されたので、関数が一致する可能性がありますか?また、これをグローバルにどのように定義しますか?AppDelegateのクラスの外に配置しようとしましたが、100万回のprint()呼び出しがあるにもかかわらず、呼び出されませんでした。これが私が試したものです:func print(object:Any){Swift.print(object)}
チャーリー

@Charlieはい、私はまだそれをにprintln変更して使用していprintます。それが機能しない理由は、print定義がSwiftの定義と一致しないため、オーバーライドしていないためです。何度も指摘されているように、Swiftにはスプラット演算子がないため、可変個引数を渡すことができないため、わずかな問題があります。ただし、1つのアイテムに対しては正常に機能し、として渡すことができますitems[0]
マット2015年

2
これらのログステートメントをコードの高性能セクションに挿入する場合の注意点が1つあります。Swiftは、使用されない場合でも、文字列補間とパラメーターのレンダリングに時間を費やして関数に渡します。ステートメントを実際に条件付きで削除するために私が見る唯一の方法は、それらをフラグに基づいて述語することです。たとえば、if(log){print(..)}が使用されている各場所にあります。
Pat Niemeyer 2015年

46

Swift 4.x用に更新:

Swift 2.0 /3.0およびXcode7 / 8のベータ版が終了したため、リリースビルドで印刷機能を無効にする方法にいくつかの変更が加えられました。

上記の@mattと@NateBirkholzによって言及された、まだ有効ないくつかの重要なポイントがあります。

  1. println()関数が置き換えられていますprint()

  2. #if DEBUG マクロを使用 するには、「Swiftコンパイラ-カスタムフラグ-その他のフラグ」を定義して値を含める必要があります-D DEBUG

  3. コードで通常どおり関数をSwift.print()使用できるように、グローバルスコープで関数をオーバーライドすることをお勧めしますが、print()デバッグ以外のビルドの出力は削除されます。Swift 2.0 /3.0でこれを行うためにグローバルスコープで追加できる関数シグネチャは次のとおりです。

    func print(items: Any..., separator: String = " ", terminator: String = "\n") {
    
        #if DEBUG
    
        var idx = items.startIndex
        let endIdx = items.endIndex
    
        repeat {
            Swift.print(items[idx], separator: separator, terminator: idx == (endIdx - 1) ? terminator : separator)
            idx += 1
        }
        while idx < endIdx
    
        #endif
    }
    

注:ここでは、デフォルトの区切り文字をスペースに設定し、デフォルトのターミネーターを改行に設定しています。必要に応じて、プロジェクトでこれを別の方法で構成できます。

お役に立てれば。

更新:

通常、この関数をグローバルスコープに配置して、Swiftの前に配置することをお勧めします。 print関数のます。これを整理する最良の方法は、この関数をグローバルスコープに配置できるユーティリティファイル(DebugOptions.Swiftなど)をプロジェクトに追加することです。

Swift 3以降、++オペレーターは非推奨になります。この変更を反映するために、上記のスニペットを更新しました。


1
申し訳ありませんが、関数はどこに配置しますか?
DàChún

@ User9527プロジェクト全体でアクセスできるように、これをグローバルスコープのどこかに配置したいと思うかもしれません。私のプロジェクトでは、ユーティリティswiftファイル(DebugOptions.swiftなど)を追加し、この関数をグローバルスコープに配置します(つまり、囲まれたクラスには配置しません)。
Glavid 2015年

Swift-Xcodeの現在のバージョンの時点で、-Dデバッグをフラットに設定しなくてもprintステートメントがデバイスコンソールに出力されないことを確認できますか?少なくともそれは私が今日テストしたものです。
user523234 2016

1
Swift 3の時点で、引数のリストの先頭にアンダースコアを追加することで、もう少し簡潔にすることができます。 "print(_ items ..."
Jonathan Zhan 2016

7
そこで、(didFinishLaunching ...で使用されている)印刷の参照を調べたところ、元の印刷関数Swiftが示されました。:ということと一緒JonathanZhanさんのコメント@を入れて、私はそれが動作します。このような外観と出来上がりに機能を調整するpublic func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
ジョニー

38

私を含むこれらすべてのアプローチの問題は、print引数を評価するオーバーヘッドが取り除かれないことです。どちらを使用しても、これは高額になります。

print(myExpensiveFunction())

唯一の適切な解決策は、実際の印刷呼び出しを条件付きコンパイルでラップすることです(DEBUGデバッグビルドに対してのみ定義されていると仮定しましょう)。

#if DEBUG
print(myExpensiveFunction())
#endif

それだけmyExpensiveFunctionで、リリースビルドで呼び出されるのを防ぎます。

ただし、自動閉鎖を使用すると、評価を1レベル遅らせることができます。したがって、私のソリューション(これはSwift 3です)を次のように書き直すことができます。

func print(_ item: @autoclosure () -> Any, separator: String = " ", terminator: String = "\n") {
    #if DEBUG
    Swift.print(item(), separator: separator, terminator: terminator)
    #endif
}

これにより、1つだけ印刷する場合に問題が解決します。これは、通常は当てはまります。これitem()は、リリースモードでは呼び出されないためです。print(myExpensiveFunction())したがって、コールは評価されずにクロージャにラップされ、リリースモードではまったく評価されないため、コストがかからなくなります。


何の用途@autoclosure
ケリン2017年

あなたの本の@mattは、「印刷の重要な機能は、アプリがXcodeとは独立して起動されたときに効果的に抑制されることです」と述べています。つまり、最近提出されたアプリに印刷ステートメントを残すことができるということですか、それとも私は誤解していますか?何か?
hidden-username

@ hidden-usernameはい、print出荷コードにステートメントを残す傾向がありますが、それはここでの私の答えとは異なります。print文の出力は、あなたのXcodeに依存しないリリースビルドでコンソールに送信されていませんが、それはまだされて評価され、それはそれは高価であるか、望ましくない副作用を持っているだけの場合にはその評価を抑制する方法を知っておくと便利残っているので、。
マット2018年

@matt oh ok ...うん私はそれを誤解した。コメントアウトします。ありがとう
隠しユーザー名

このアプローチは、印刷された文字列をバイナリファイルから削除しますか?たとえば、そのメソッドを使用してアプリのどこかに「print( "userlogined")」を配置し、誰かが私のアプリをリバースエンジニアリングしようとすると、この文字列がどこかに見つかるのでしょうか、それともまったく存在しないのでしょうか。
LeszekSzary19年

18

すでに述べたように、私は学生であり、従うためにもう少し明確に定義されたものが必要です。多くの調査の後、私が従う必要のある順序は次のとおりです。

Xcodeプロジェクトウィンドウの左側にあるファイルナビゲータの上部にあるプロジェクト名をクリックします。これは、プロジェクトの名前、ビルドターゲットの数、およびiOSSDKのバージョンを含む行です。

[ビルド設定]タブを選択し、下部にある[ Swiftコンパイラ-カスタムフラグ]セクションまで下にスクロールします。その他のフラグの横にある下矢印をクリックします、セクションを展開します。

デバッグ行をクリックして選択します。線の右側にマウスカーソルを置き、ダブルクリックします。リストビューが表示されます。+をクリックしますリストビューの左下にある ]ボタンを、値を追加します。テキストフィールドがアクティブになります。

テキストフィールドにテキスト-D DEBUGを入力し、Returnキーを押しますをて行をコミットします。

プロジェクトに新しいSwiftファイルを追加します。ファイルのカスタムクラスを作成する場合は、次の行に沿ってテキストを入力します。

class Log {

  var intFor : Int

  init() {
    intFor = 42
   }

  func DLog(message: String, function: String = __FUNCTION__) {
    #if DEBUG
      println("\(function): \(message)")
    #endif
  }
}

今日、クラスをXcodeに受け入れさせるのに苦労していたので、initは必要以上に重いかもしれません。

次にprintln()、該当するすべてのクラスのプロパティとしてこれを追加する代わりに、新しいカスタム関数を使用する予定のクラスでカスタムクラスを参照する必要があります。

   let logFor = Log()

これで、のインスタンスをprintln()で置き換えることができますlogFor.DLog()。出力には、その行が呼び出された関数の名前も含まれます。

クラス関数内では、そのクラスのクラス関数として関数のコピーを作成しない限り、関数を呼び出すことができずprintln()、入力に対してもう少し柔軟性があるため、のすべてのインスタンスでこれを使用できなかったことに注意してください。私のコード。


8
デバッグログ用のカスタムクラスを作成する必要はありません。グローバル関数を使用する方が簡単で実用的です。
Vojtech Vrbka 2015

intFor = 42の使用は何ですか?
テッド

15

スウィフト5

プロジェクトに新しいファイルを作成し、次のコードを貼り付けるだけです。

func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    #if DEBUG
    items.forEach {
        Swift.print($0, separator: separator, terminator: terminator)        
    }
    #endif
}

この関数シグネチャはデフォルトのSwiftシグネチャと一致するため、プロジェクトの関数を「上書き」します。必要に応じて、を使用してオリジナルにアクセスできますSwift.print()

上記のコードを追加したらprint()、通常どおり使用し続けると、デバッグビルドでのみ出力されます。

注:forEach各アイテムを印刷するために実行すると、itemsまっすぐに渡した場合に表示されるprintステートメントの周りの煩わしい配列括弧が削除されます。Swift.print()ます。

Swiftに比較的慣れていない人にとって$0は、一体何なのか疑問に思うかもしれません。これは、forEachブロックに渡される最初の引数を表すだけです。forEach声明はまた、このように書くことができます:

items.forEach { item in
    Swift.print(item, separator: separator, terminator: terminator)        
}

最後に、興味がある場合、のSwift宣言はprint次のようになります。

public func print(_ items: Any..., separator: String = " ", terminator: String = "\n")

上記の私の答えは、正確なSwiftの実装を反映していますが、複数のものを印刷したり、区切り文字/ターミネーターを変更したりすることはありません。しかし、誰が知っているか、あなたはしたいかもしれません。


2
この関数をどこで宣言するか、これはこのような拡張機能またはsmthですか?各ファイルで宣言したくないだけです)
MatrosovAlexander19年

1
@MatrosovAlexanderアプリプロジェクトのどこにでも迅速なファイルを作成し、このコードを挿入するだけです。コンパイラーは、グローバルにアクセスできるようにするのに十分なほどスマートです。
Trev 1419

11

これが私が使っている関数で、Swift3で完全に機能します。

func gLog<T>( _ object: @autoclosure() -> T, _ file: String = #file, _ function: String = #function, _ line: Int = #line)
    {
    #if DEBUG
        let value = object()
        let stringRepresentation: String

        if let value = value as? CustomDebugStringConvertible
            {
            stringRepresentation = value.debugDescription
            }
        else if let value = value as? CustomStringConvertible
            {
            stringRepresentation = value.description
            }
        else
            {
            fatalError("gLog only works for values that conform to CustomDebugStringConvertible or CustomStringConvertible")
            }

        let fileURL = NSURL(string: file)?.lastPathComponent ?? "Unknown file"
        let queue = Thread.isMainThread ? "UI" : "BG"
    let gFormatter = DateFormatter()
    gFormatter.dateFormat = "HH:mm:ss:SSS"
        let timestamp = gFormatter.string(from: Date())

        print("✅ \(timestamp) {\(queue)} \(fileURL) > \(function)[\(line)]: " + stringRepresentation + "\n")
    #endif
    }

生成される出力の例を次に示します。

出力のスクリーンショット

説明:

  • 緑のチェックマークは、コンソールで印刷(gLog)メッセージをすばやく確認できるようにするために使用されます。他のメッセージの海でメッセージが失われることがあります。

  • 時刻/日付スタンプ

  • 実行されているスレッド-私の場合は、MainThread(UIと呼びます)か、MainThread(バックグラウンドスレッドの場合はBGと呼びます)ではありません。

  • gLogメッセージが存在するファイルの名前

  • gLogメッセージが存在するファイル内の関数

  • gLogメッセージの行番号

  • 印刷したい実際のgLogメッセージ

これが他の誰かに役立つことを願っています!


これを別のファイルに入れて、アプリ全体で使用できますか?クラスメソッドとして、別のクラスファイルに入れてみました。しかし、libMobileGestalt MobileGestaltSupport.m:153でクラッシュします:pid 2574(デモ)にはfrZQaeyWLUvLjeuEK43hmgのサンドボックスアクセスがなく、libMobileGestalt MobileGestalt.c:550の適切な資格がありません:InverseDeviceIDへのアクセスがありません(<rdar:// problem / 11744455>を参照) )デバッガーからのメッセージ:メモリの問題により終了しました
omarojo 2017

omarojo、これをアプリ全体のグローバル関数として使用しています。クラスは必要ありません。utils.swiftという名前のファイルがあります。このファイルには、このようなユーティリティ関数がすべて含まれています。Foundationをインポートする必要があります-おそらくそれはあなたが逃したステップですか?クラス内の静的な機能として、またはグローバル関数として、クラス内のあなたの関数を宣言する詳細は、ところで、このSOの質問と回答を参照してください。stackoverflow.com/questions/30197548/...を
ジーンLoparco

ええ、関数を内部に持つ新しいファイルを作成するだけで機能しました。何らかの理由でそれをクラス関数として持つと、明確なデバッグメッセージなしでアプリがクラッシュします。
omarojo 2017

この男に感謝します、私が前にそれを発見しなかったのは残念です。デバッグの頭痛の種を大幅に減らしました。
ベオウルフ

私の喜び@beowulf!
GeneLoparco18年

9

でテストスウィフト2.1Xcodeの7.1.1

空の関数がSwiftコンパイラによって削除されることがわかったら、リリースバージョンからすべてのprintステートメントを除外する簡単な方法があります。

補足:Objective-Cの時代には、コンパイラが起動する前にNSLogステートメントを削除するために使用できるプリパーサーがありました。これは、ここでの私の回答説明されています。ただし、Swiftにはプリパーサーがないため、このアプローチは無効になります。

これが、リリースビルドで削除することを心配することなく、高度で簡単に構成できるログ機能として今日使用しているものです。また、さまざまなコンパイラフラグを設定することで、必要に応じてログに記録される情報を微調整できます。

あなたは必要に応じて機能を微調整することができます、それを改善するための提案は大歓迎です!

// Gobal log() function
//
// note that empty functions are removed by the Swift compiler -> use #if $endif to enclose all the code inside the log()
// these log() statements therefore do not need to be removed in the release build !
//
// to enable logging
//
// Project -> Build Settings -> Swift Compiler - Custom flags -> Other Swift flags -> Debug
// add one of these 3 possible combinations :
//
//      -D kLOG_ENABLE
//      -D kLOG_ENABLE -D kLOG_DETAILS
//      -D kLOG_ENABLE -D kLOG_DETAILS -D kLOG_THREADS
//
// you can just call log() anywhere in the code, or add a message like log("hello")
//
func log(message: String = "", filePath: String = #file, line: Int = #line, function: String = #function) {
            #if kLOG_ENABLE

            #if kLOG_DETAILS

            var threadName = ""
            #if kLOG_THREADS
                threadName = NSThread.currentThread().isMainThread ? "MAIN THREAD" : (NSThread.currentThread().name ?? "UNKNOWN THREAD")
                threadName = "[" + threadName + "] "
            #endif

            let fileName = NSURL(fileURLWithPath: filePath).URLByDeletingPathExtension?.lastPathComponent ?? "???"

            var msg = ""
            if message != "" {
                msg = " - \(message)"
            }

            NSLog("-- " + threadName + fileName + "(\(line))" + " -> " + function + msg)
        #else
            NSLog(message)
        #endif
    #endif
}

ここで、コンパイラフラグを設定します。

ここに画像の説明を入力してください

すべてのフラグがオンになっている出力例は次のようになります。

   2016-01-13 23:48:38.026 FoodTracker[48735:4147607] -- [MAIN THREAD] ViewController(19) -> viewDidLoad() - hello

log()を含むコードは次のようになります。

    override func viewDidLoad() { log("hello")
    super.viewDidLoad()

   // Handle the text field's user input through delegate callbacks
   nameTextField.delegate = self
}

良いですね!ここから取って、最終的にAELogAEConsoleを作りました
tadija 2016

これは、DEBUGモードで正常に機能しています。これで、EditSchemeからRELEASEモードに変更しました。リリースモードのログインコンソールウィンドウも表示されます。なぜそうなのか?
Jayprakash Dubey 2017

Xcode9のSwift3.2の場合、ログを印刷して呼び出すようにNSLogを変更する必要がありました(メッセージ: "hello")。また、フラグを引用符付きで "-D" "kLOG_ENABLE"として入力する必要がありました。他のすべての迅速なバージョンの更新は、提案された修正とともにコンパイラーによって取得されました。
iCyber​​Paul 2017

1
ここで、「空の関数はSwiftコンパイラによって削除されます」と述べていますが、ドキュメントのどこにありますか?それが事実であることをどうやって知っていますか?@ ronny-webers
zumzum

7

さらに簡単に、デバッグビルド設定-D DEBUGが設定されていることを確認した後OTHER_SWIFT_FLAGS

#if !DEBUG
    func print(_ items: Any..., separator: String = " ", terminator: String = "\n") { }
#endif

印刷可能なオブジェクトは、wwdcのビデオではめったに言及されていないシステムプロトコルの1つに準拠しているため、これには「場所」が必要になると思われます。迅速なガイド1.2と2の最後で、違いがあれば忘れてしまったと思います。システム1と1つです
Stephen J

これまでのところ、これはSwift1.2で機能します。2.0を試したことがありません。
リベラ

6

XCode 8では、いくつかの新しいビルド設定が導入されました。
特に、参照さActive Compilation Conditionsれているものは、他のフラグ設定が行ったのと同様の方法で行います。

「アクティブコンパイル条件」は、条件付きコンパイルフラグをSwiftコンパイラに渡すための新しいビルド設定です。

XCode 8(8.3.2でテスト済み)に従って、デフォルトでこれを取得します。

ここに画像の説明を入力してください

したがって、設定なしで次のように書くことができます。

#if DEBUG
    print("⚠️ Something weird happened")
#endif

このアプローチを広範囲に使用する場合は、このロギングロジックをラップするクラス/構造体/関数を作成することを強くお勧めします。これをさらに拡張することをお勧めします。


4

これまでのところ、VarunNahariaの方が優れた解決策があります。私は彼の答えをリベラの答えと組み合わせるでしょう...

  1. -D DEBUGコンパイラ指令にフラグを作成し、設定をビルドします。
  2. 次に、次のコードを追加します。

    #if !DEBUG
     public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    }
    #endif
    

このコードはprint、リリースのためにすべてを何にも変換しません。


3

Swift 4 Xcode 10.0

多分あなたはこれを使うことができます

func dPrint(_ message: @autoclosure () -> Any) {
    #if DEBUG
    print(message())
    #endif
}

使用する理由 @autoclosure、メッセージパラメータとして関数を渡すと、その関数はデバッグモードでのみ呼び出され、パフォーマンスが低下するためです。

Swift.print(_ items: Any..., separator: String = default, terminator: String = default)関数とは異なり、私のソリューションにはパラメーターが1つしかありません。ほとんどの場合、print関数はコンソールに情報のみを表示するため、複数のパラメーターを渡さず、パラメーターを文字列に変換するだけ"\(param1)"+"\(param2)"です。私の解決策が好きだといいのですが


1

ブレークポイントを使用して、評価後に続行するように設定し、ブレークポイントに印刷メッセージを書き込むこともできます。

ここに画像の説明を入力してください


0

debug_println内容を大まかに定義するには、次のようにします。

#if DEBUG
  println()
#endif

ありがとう、どこでそれを定義するのが一番いいでしょうか?私は学生です。恐れています。助けに感謝しますが、より明確な文脈が必要です。
Nate Birkholz 2014年

使用したい場所にインポートするヘッダーファイルで宣言します。
イアンマクドナルド

0

私の解決策は、クラスの前にAppDelegateでこのコードを使用することです

// Disable console log in live app
#if !arch(x86_64) && !arch(i386)
    public func debugPrint(items: Any..., separator: String = " ", terminator: String = "\n") {

    }
    public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {

    }
#endif

class AppDelegate: UIResponder, UIApplicationDelegate {
// App Delegate Code 

}

0

私の解決策のために私はそれを簡単にします

import UIKit

class DLog: NSObject {

   init(title:String, log:Any) {
       #if DEBUG
           print(title, log)
       #endif

   }

}

それを表示するには、

_ = DLog(title:"any title", log:Any)

0

私はこれを使用することになりました:

#if DEBUG
func dLog(_ item: @autoclosure () -> Any, _ file: String = #file, _ function: String = #function, _ line: Int = #line) {
    print("\(Date()) [\((file as NSString).lastPathComponent):\(line) \(function)] \(item())")
}
#else
func dLog(_ item: @autoclosure () -> Any) {}
#endif

それは非常にコンパクトで、いくつかの有用な情報(タイムスタンプ、迅速なファイル名、コード行、関数名)を出力し、少なくとも私のテストでは、16進エディターで開いたときにアプリケーションのバイナリファイルにログに記録された文字列を見つけることができませんでした。


0

さらに簡単:アサーションがリリースビルドから削除され、そこからのみプリントを呼び出すという事実を利用してください。これにより、リリース用にビルドするときに空であるため、すべてのログ呼び出し(はい、Log.daへの呼び出しも)削除されます

しかし、リリースビルドではプリントが削除されると聞きましたが、書面で見つけることができませんでした。だから今のところ、私はLog以下のようなものを使用しています。私はGitHubに絵文字(読みやすさのため)とログトピック(一貫性のため)を備えたより肉厚なバージョンを持っています:

https://github.com/Gatada/JBits/blob/master/Project/Utility/Log.swift

public enum Log {

    /// A date formatter used to create the timestamp in the log.
    ///
    /// This formatter is only created if it is actually used, reducing the
    /// overhead to zero.
    static var formatter: DateFormatter?

    // MARK: - API

    /// Call to print message in debug area.
    ///
    /// Asserts are removed in release builds, which make
    /// the function body empty, which caused all calls to
    /// be removed as well.
    ///
    /// Result is zero overhead for release builds.
    public static func da(_ message: String) {
        assert(debugAreaPrint(message))
    }

    // MARK: - Helpers

    /// The function that actually does the printing. It returns `true` to
    /// prevent the assert from kicking in on debug builds.
    private static func debugAreaPrint(_ message: String) -> Bool {
        print("\(timestamp) - \(message)")
        return true
    }

    /// Creates a timestamp used as part of the temporary logging in the debug area.
    static private var timestamp: String {

        if formatter == nil {
            formatter = DateFormatter()
            formatter!.dateFormat = "HH:mm:ss.SSS"
        }

        let date = Date()
        return formatter!.string(from: date)
    }
}

コード内:

Log.da("This is only handled in a debug build.")

デバッグビルドを実行している場合にのみ、Xcodeデバッグ領域に表示されます。

13:36:15.047-これはデバッグビルドでのみ処理されます。


0

私のプロジェクトはObjectiveCで開発されましたが、昨年からSwiftで新しいコードのマージを開始したので、以下のソリューションでSwiftが機能し、そのコードをMySwift定数ファイルに追加しました。

func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    #if DEBUG
    items.forEach {
        Swift.print($0, separator: separator, terminator: terminator)
    }
    #endif
}

0

これは私にとってはうまくいきます(これをプロジェクトのグローバル関数として追加してください)

func print(_ items: Any...) {
    #if DEBUG
        Swift.print(items[0])
    #endif
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.