Was ist der Unterschied zwischen print
, NSLog
und println
und wann soll ich je benutzen?
Zum Beispiel würde ich in Python, wenn ich ein Wörterbuch drucken wollte, nur print myDict
, aber jetzt habe ich zwei andere Optionen. Wie und wann soll ich sie verwenden?
os_log
. Bitte sehen Sie meine Antwort unten .os_log
: Versuchen Sie, die vollständige Dokumentation der Objective-C-Seite anzuzeigen. Es ist viel vollständiger .Antworten:
Ein paar Unterschiede:
print
vsprintln
:Die
print
Funktion druckt beim Debuggen von Apps Nachrichten in der Xcode-Konsole.Das
println
ist eine Variante davon , die in Swift 2 entfernt wurden , und wird verwendet , nicht mehr. Wenn Sie alten Code sehen, der verwendet wirdprintln
, können Sie ihn jetzt sicher durch ersetzenprint
.Zurück in Swift 1.x wurden
print
am Ende der gedruckten Zeichenfolge keine Zeilenumbrüche hinzugefügt, wohingegenprintln
dies der Fall war . Heutzutage wird jedochprint
immer das Zeilenumbruchzeichen am Ende der Zeichenfolge hinzugefügt. Wenn Sie dies nicht möchten, geben Sie einenterminator
Parameter von an""
.NSLog
::NSLog
ist langsamer;NSLog
Fügt der Ausgabe einen Zeitstempel und eine Kennung hinzu, während diesprint
nicht der Fall ist.NSLog
Anweisungen werden sowohl in der Gerätekonsole alsprint
auch in der Debugger-Konsole angezeigt, während sie nur in der Debugger-Konsole angezeigt werden.NSLog
verwendetprintf
Zeichenfolgen im Stil von -style, zdas wird produzieren:
Ab iOS 10 / macOS 10.12 gibt es eine dritte Alternative, die
os_log
Teil des "Unified Logging" -Systems ist (siehe WWDC 2016-Video Unified Logging und Activity Tracing ).Sie müssen importieren,
os.log
bevor Sie dieos_log
Funktion verwenden:Gefällt mir
NSLog
,os_log
werden Nachrichten sowohl an die Xcode-Debugging-Konsole als auch an die Gerätekonsole ausgegebenSie können jetzt die Felder "Subsystem" und "Kategorie" steuern, die in der Konsolen-App verfügbar sind. Zum Beispiel:
Wenn Sie die App über die externe Konsolen-App beobachten, können Sie diese Spalten nicht nur zur Hauptansicht hinzufügen, sondern auch anhand dieser Spalten filtern. Dies ist sehr nützlich, wenn Sie Ihre Debugging-Nachrichten von (a) denen unterscheiden möchten, die von anderen Subsystemen im Auftrag Ihrer App generiert wurden. oder (b) Nachrichten aus anderen Kategorien oder Typen.
Sie können verschiedene Arten von Protokollierung Nachrichten angeben, entweder
.info
,.debug
,.error
,.fault
(oder.default
):Wenn Sie also die externe Konsolen-App verwenden, können Sie festlegen, dass nur Nachrichten bestimmter Kategorien angezeigt werden (z. B. Debugging-Nachrichten nur anzeigen, wenn Sie im Menü "Aktion" der Konsole "Debug-Nachrichten einschließen" auswählen). Diese Einstellungen bestimmen auch viele subtile Details darüber, ob Dinge auf der Festplatte protokolliert werden oder nicht. Weitere Informationen finden Sie im WWDC-Video.
Sie können bei der Verwendung keine Zeichenfolgeninterpolation verwenden
os_log
. Zum Beispiel können Sie nicht tun:Sie müssten tun:
Einer der Gründe für die oben genannte Einschränkung ist die Unterstützung des Datenschutzes. Primitive Datentypen (z. B. Zahlen) sind standardmäßig öffentlich und Objekte (z. B. Zeichenfolgen) sind standardmäßig privat. Im vorherigen Beispiel, in dem Sie die URL protokolliert haben, wird Folgendes angezeigt, wenn die App vom Gerät selbst aufgerufen wurde und Sie sie über die Konsolen-App Ihres Mac ansehen.
Wenn Sie es von einem externen Gerät aus sehen möchten, müssen Sie Folgendes tun:
Beachten Sie, dass
NSLog
jetzt das einheitliche Benachrichtigungssystem hinter den Kulissen verwendet wird, jedoch mit den folgenden Einschränkungen:Sie können das Subsystem, die Kategorie oder den Protokolltyp nicht steuern.
Datenschutzeinstellungen werden nicht unterstützt.
Unterm Strich
print
ist dies für einfache Aufgaben ausreichend, aberNSLog
nützlich, da es Zeitstempelinformationen für Sie enthält.Die Leistung von wird
os_log
beim Debuggen von iOS-Apps, die außerhalb von Xcode getestet werden müssen, deutlich erleichtert. Wenn Sie beispielsweise iOS-App-Prozesse im Hintergrund wie das Abrufen im Hintergrund testen, ändert die Verbindung zum Xcode-Debugger den App-Lebenszyklus . Daher möchten Sie häufig auf einem physischen Gerät testen, die App vom Gerät selbst ausführen und die App nicht über den Xcode-Debugger starten. Mit der einheitlichen Protokollierung können Sie Ihre iOS-Geräteanweisungen weiterhinos_log
über die macOS Console-App anzeigen.quelle
print
, wird es genau wie im Debug-Bereich von Xcode angezeigtdebugPrint
. Der einzige Unterschied besteht darin, dassprint
diedescription
Methode des Objekts aufgerufen wird unddebugPrint
Aufrufe ausgeführt werdendebugDescription
, die ausführlicher sein können alsdescription
.Wenn Sie Swift 2 verwenden , können Sie jetzt nur print () verwenden, um etwas in die Ausgabe zu schreiben.
Auf iOS 9 aktualisiert
Standardmäßig beendet die Funktion die gedruckte Zeile durch Hinzufügen eines Zeilenumbruchs.
Terminator
Übergeben Sie eine leere Zeichenfolge als Abschlusszeichen, um einen Wert ohne Zeilenumbruch danach zu drucken
Separator
Sie können jetzt Trennzeichen verwenden, um mehrere Elemente zu verketten
Beide
Oder Sie können mit auf diese Weise kombinieren
quelle
appendNewline
hat einen Standardwert vontrue
terminator : ""
zBprint("...", terminator: "")
Darüber hinaus hat Swift 2
debugPrint()
(undCustomDebugStringConvertible
Protokoll)!Vergessen Sie nicht,
debugPrint()
wieprint()
es funktioniert, aber am besten zum Debuggen geeignet ist .Beispiele:
print("Hello World!")
wirdHello World
debugPrint("Hello World!")
wird"Hello World"
(Zitate!)print(1..<6)
wird1..<6
debugPrint(1..<6)
wirdRange(1..<6)
Jede Klasse kann ihre Darstellung der Debug-Zeichenfolge über das
CustomDebugStringConvertible
Protokoll anpassen .quelle
DebugPrintable
Protokoll wurde inCustomDebugStringConvertible
Protokoll umbenannt .description
istdebugDescription
als Pythonstr
istrepr
?Als Ergänzung zu Robs Antwort hat Apple seit iOS 10.0 ein völlig neues "Unified Logging" -System eingeführt, das vorhandene Protokollierungssysteme (einschließlich ASL und Syslog, NSLog) ersetzt und dank seiner neuen Techniken, einschließlich der vorhandenen Protokollierungsansätze, die Leistung übertrifft Protokolldatenkomprimierung und verzögerte Datenerfassung.
Von Apple :
Apple empfiehlt dringend
os_log
, künftig alle Arten von Nachrichten zu protokollieren, einschließlich Informationen, Debugging und Fehlermeldungen, da die Leistung im Vergleich zu früheren Protokollierungssystemen erheblich verbessert wurde und die zentralisierte Datenerfassung eine bequeme Protokoll- und Aktivitätsprüfung für Entwickler ermöglicht. Tatsächlich ist das neue System wahrscheinlich so klein, dass es keinen "Beobachter-Effekt" verursacht, bei dem Ihr Fehler verschwindet, wenn Sie einen Protokollierungsbefehl einfügen, wodurch das Timing des Fehlers beeinträchtigt wird.Mehr dazu erfahren Sie hier im Detail .
Um es zusammenzufassen: Verwenden
print()
Sie es zur Vereinfachung für Ihr persönliches Debugging (die Nachricht wird jedoch 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.quelle
Es gibt eine andere Methode,
dump()
die auch zum Protokollieren verwendet werden kann:Aus Swift Standard Library-Funktionen
quelle