567 Stimmen

Swift: print() vs println() vs NSLog()

Was ist der Unterschied zwischen print, NSLog und println und wann sollte ich jedes davon verwenden?

Zum Beispiel, in Python, wenn ich ein Wörterbuch ausdrucken wollte, würde ich einfach print myDict verwenden, aber jetzt habe ich 2 andere Optionen. Wie und wann sollte ich jede davon verwenden?

85voto

Jorge Casariego Punkte 21431

Wenn Sie Swift 2 verwenden, können Sie jetzt nur print() verwenden, um etwas auf die Ausgabe zu schreiben.

Apple hat sowohl die Funktionen println() als auch print() zu einer einzigen Funktion kombiniert.

Aktualisiert auf iOS 9

Standardmäßig beendet die Funktion die Zeile, die sie druckt, indem sie einen Zeilenumbruch hinzufügt.

print("Hallo Swift")

Terminator

Um einen Wert ohne Zeilenumbruch danach zu drucken, geben Sie einen leeren String als Terminator an.

print("Hallo Swift", terminator: "")

Separator

Sie können jetzt Separator verwenden, um mehrere Elemente zu verketten.

print("Hallo", "Swift", 2, separator:" ")

Beides

Oder Sie könnten es in dieser Weise kombinieren.

print("Hallo", "Swift", 2, separator:" ", terminator:".")

64voto

Valentin Shergin Punkte 6896

Darüber hinaus verfügt Swift 2 über debugPrint() (und das CustomDebugStringConvertible-Protokoll).

Vergessen Sie nicht debugPrint(), das ähnlich wie print() funktioniert, aber am besten zur Fehlerbehebung geeignet ist.

Beispiele:

  • Zeichenketten
    • print("Hallo Welt!") wird zu Hallo Welt
    • debugPrint("Hallo Welt!") wird zu "Hallo Welt" (Anführungszeichen!)
  • Bereiche
    • print(1..<6) wird zu 1..<6
    • debugPrint(1..<6) wird zu Range(1..<6)

Jede Klasse kann ihre Darstellung als Debug-Zeichenkette über das CustomDebugStringConvertible-Protokoll anpassen.

44voto

HuaTham Punkte 7386

Um zu Robs Antwort hinzuzufügen, hat Apple seit iOS 10.0 ein völlig neues "Unified Logging"-System eingeführt, das bestehende Logging-Systeme (einschließlich ASL und Syslog, NSLog) überholt und auch bestehende Logging-Ansätze in der Leistung übertrifft, dank seiner neuen Techniken einschließlich Datenkompression und verzögerter Datenprotokollierung.

Von Apple:

Das Unified-Logging-System bietet eine einzige, effiziente, leistungsstarke API zur Erfassung von Nachrichten auf allen Ebenen des Systems. Dieses vereinheitlichte System zentralisiert die Speicherung von Protokolldaten im Speicher und in einem Datenspeicher auf der Festplatte.

Apple empfiehlt dringend, ab sofort os_log zu verwenden, um alle Arten von Nachrichten zu protokollieren, einschließlich Info-, Debug- und Fehlermeldungen, aufgrund seiner ebenfalls im Vergleich zu früheren Logging-Systemen verbesserten Leistung und seiner zentralisierten Datenerfassung, die eine bequeme Protokoll- und Aktivitätsinspektion für Entwickler ermöglicht. Tatsächlich ist das neue System wahrscheinlich so geringfügig belastend, dass es nicht den "Beobachtereffekt" verursacht, bei dem Ihr Fehler verschwindet, wenn Sie einen Protokollbefehl einfügen und die Timing des Fehlers beeinflussen.

Leistung der Activity-Tracing, jetzt Teil des neuen Unified-Logging-Systems

Sie können mehr darüber in Details hier erfahren.

Zusammenfassend: Verwenden Sie print() für Ihr persönliches Debuggen aus Bequemlichkeit (aber die Nachricht wird nicht protokolliert, wenn sie auf Benutzergeräten bereitgestellt wird). Verwenden Sie dann Unified Logging (os_log) so oft wie möglich für alles andere.

16voto

yoAlex5 Punkte 20661

iOS logger

[Console Log]

  1. NSLog - fügt Metainformationen hinzu (wie Zeitstempel und Bezeichner) und ermöglicht es Ihnen, 1023 Symbole auszugeben. Druckt die Nachricht auch in die Konsole. Die langsamste Methode. Ist nicht sicher, da andere Anwendungen Zugriff auf die Protokolldatei haben können

    //@import Foundation //Objective-C
    @import Foundation
    NSLog("SomeString")
  2. print - druckt alle Zeichenfolgen in Xcode. Bietet bessere Leistung als zuvor

    //@import Foundation //Objective-C
    import Foundation
    print("SomeString")
  3. println (nur verfügbar in Swift v1) und fügt am Ende der Zeichenfolge \n hinzu

  4. os_log (ab iOS v10) - druckt auch 32768 Symbole und gibt sie in die Konsole aus. Bietet bessere Leistung als zuvor

    //@import os.log //Objective-C
    @import os.log
    os_log("SomeIntro: %@", log: .default, type: .info, "someString")
  5. Logger (ab iOS v14) - druckt auch 32768 Symbole und gibt sie in die Konsole aus. Bietet bessere Leistung als zuvor

    //@import os //Objective-C
    import os
    let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "someCategory")
    
    logger.log("some message \(Date)")
    //some message 
    //Es handelt sich um die Datenschutzstufe
    
    logger.log("some message \(Date, privacy: .public)")
    //some message 2023-11-11 16:09:03 +0000

6voto

JAL Punkte 40532

Es gibt eine weitere Methode namens dump(), die ebenfalls zum Protokollieren verwendet werden kann:

func dump(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)

Gibt den Inhalt eines Objekts mithilfe seines Spiegels auf die Standardausgabe aus.

Von Swift Standard Library Functions

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X