Jaka jest różnica między print, NSLogi printlnkiedy należy używać każdego?
Na przykład w Pythonie, gdybym chciał wydrukować słownik, chciałbym tylko print myDict, ale teraz mam 2 inne opcje. Jak i kiedy powinienem używać każdego z nich?
co z NSLog i wydrukowaniem NSDictionary nic mi nie da?
Użytkownik
Od wersji iOS 10.0 zaleca się korzystanie z niej os_log. Zobacz moją odpowiedź poniżej .
HuaTham,
Oprócz przeglądania dokumentacji Swift na os_log: spróbuj zobaczyć pełną dokumentację strony C celu. Jest o wiele bardziej kompletny .
Kochanie,
Odpowiedzi:
758
Kilka różnic:
printvs println:
Do printwiadomości druki funkcyjne w konsoli Xcode podczas debugowania aplikacji.
printlnJest odmianą tego, który został usunięty w Swift 2 i nie jest stosowane. Jeśli widzisz stary używany kod println, możesz go teraz bezpiecznie zastąpić print.
W wersji Swift 1.x printnie dodawano znaków nowego wiersza na końcu drukowanego ciągu, a printlnzrobiono to. Ale w dzisiejszych czasach printzawsze dodaje znak nowej linii na końcu łańcucha, a jeśli nie chcesz tego robić, podaj terminatorparametr "".
NSLog:
NSLog jest wolniejszy;
NSLogdodaje znacznik czasu i identyfikator do wyniku, natomiast printnie;
NSLoginstrukcje pojawiają się zarówno w konsoli urządzenia, jak i konsoli debuggera, podczas gdy printpojawiają się tylko w konsoli debuggera.
Podobnie NSLog, os_logwyświetli komunikaty zarówno do konsoli debugowania Xcode, jak i konsoli urządzenia
Możesz teraz kontrolować pola „podsystem” i „kategoria” dostępne w aplikacji konsoli. Na przykład:
let log =OSLog(subsystem:Bundle.main.bundleIdentifier!, category:"network")
os_log("url = %@", log: log, url.absoluteString)
Gdy obserwujesz aplikację za pomocą zewnętrznej aplikacji konsoli, możesz nie tylko dodać te kolumny do głównego widoku, ale możesz je filtrować na ich podstawie. Jest to bardzo przydatne, gdy chcesz odróżnić wiadomości debugowania od (a) wiadomości generowanych przez inne podsystemy w imieniu Twojej aplikacji; lub (b) wiadomości z innych kategorii lub typów.
Można określić różne typy rejestrowania komunikatów, albo .info, .debug, .error, .fault(a .default):
os_log("web service did not respond", type:.error)
Tak więc, jeśli używasz zewnętrznej aplikacji konsoli, możesz wyświetlać tylko wiadomości niektórych kategorii (np. Pokazywać wiadomości debugowania tylko, jeśli wybierzesz „Uwzględnij komunikaty debugowania” w menu „Akcja” konsoli). Te ustawienia dyktują również wiele subtelnych problemów dotyczących tego, czy rzeczy są zapisywane na dysku, czy nie. Zobacz wideo WWDC, aby uzyskać więcej informacji.
Podczas używania nie można używać interpolacji ciągów os_log. Na przykład nie możesz zrobić:
os_log("foo \(url.absoluteString)")
Musisz zrobić:
os_log("url = %@", url.absoluteString)
Jednym z powodów powyższego ograniczenia jest wspieranie prywatności danych. Pierwotne typy danych (np. Liczby) są domyślnie publiczne, a obiekty (np. Łańcuchy) są domyślnie prywatne. W poprzednim przykładzie, w którym zarejestrowałeś adres URL, jeśli aplikacja została wywołana z samego urządzenia i oglądałeś z aplikacji konsoli Maca, zobaczysz:
url = <prywatne>
Jeśli chcesz zobaczyć to z urządzenia zewnętrznego, musisz zrobić:
os_log("url = %{public}@", url.absoluteString)
Uwaga: NSLogteraz używa ujednoliconego systemu powiadomień za kulisami, ale z następującymi zastrzeżeniami:
Nie można kontrolować podsystemu, kategorii lub typu dziennika;
Nie obsługuje ustawień prywatności.
Podsumowując, printwystarcza do prostych zadań, ale NSLogjest użyteczny, ponieważ zawiera informacje o znacznikach czasu.
Moc os_logdebiutu w aplikacjach na iOS, które muszą być testowane poza Xcode, jest ogromna. Na przykład podczas testowania procesów aplikacji iOS w tle, takich jak pobieranie w tle, połączenie z debuggerem Xcode zmienia cykl życia aplikacji . Tak więc często będziesz chciał przetestować na urządzeniu fizycznym, uruchamiając aplikację z samego urządzenia, a nie uruchamiając aplikację z debugera Xcode. Ujednolicone rejestrowanie pozwala nadal oglądać os_logwyciągi z urządzenia z iOS w aplikacji MacOS Console.
Ładne podsumowanie! Aby dodać jeszcze kilka: możesz przekazać NSString do println, ale nie NSLog; możesz dodawać argumenty dla NSLog, ale nie println; Szybka interpolacja ciągów znaków czasami zawiesza się dla NSLog, ale nie println.
@ Rob, jeśli korzystam z print, to czy pojawia się w konsoli debugowania, czy nie? Czy powinniśmy używać debugPrint?
1
Jeśli używasz print, pokazuje się w obszarze debugowania Xcode, podobnie jak debugPrint. Jedyną różnicą jest to, że printkończy się descriptionmetoda wywołania obiektu i debugPrintwywołań debugDescription, które mogą być bardziej szczegółowe niż description.
Rob
@ Kochanie, ten wątek komentarza został oznaczony jako zbyt długi, więc chciałem tylko przypomnieć, że komentarze nie są przeznaczone do długich dyskusji lub sesji debugowania. Jeśli masz coś, co może zostać poproszony jako pytanie, który jest odpowiedni dla formatu przepełnienie stosu, następnie należy poprosić go jako pytanie tak, że każdy może korzystać z jego odpowiedzi. Jeśli to nie działa jako pytanie, musisz porozmawiać na czacie. Zarezerwuj komentarze tylko po to, by poprosić o wyjaśnienia lub dokonać szybkich obserwacji.
Cody Gray
80
Jeśli używasz Swift 2 , teraz możesz tylko print () zapisać coś na wyjściu.
Apple połączył funkcje println () i print () w jedną.
Zaktualizowano do iOS 9
Domyślnie funkcja kończy linię, którą drukuje, dodając podział linii.
print("Hello Swift")
Terminator
Aby wydrukować wartość bez podziału wiersza po niej, podaj pusty ciąg jako terminator
print("Hello Swift", terminator:"")
Separator
Możesz teraz używać separatora do łączenia wielu elementów
Więc Swift descriptionjest debugDescriptionjak Pythona strjest repr?
BallpointBen
Tak myślę.
Valentin Shergin
39
Aby dodać do odpowiedzi Roba, od iOS 10.0 Apple wprowadził zupełnie nowy system „Unified Logging”, który zastępuje istniejące systemy rejestrowania (w tym ASL i Syslog, NSLog), a także przewyższa istniejące metody rejestrowania wydajności, dzięki nowym technikom, w tym kompresja danych dziennika i odroczone zbieranie danych.
Zunifikowany system rejestrowania zapewnia jeden, wydajny i wydajny interfejs API do przechwytywania komunikatów na wszystkich poziomach systemu. Ten zunifikowany system centralizuje przechowywanie danych dziennika w pamięci i magazynie danych na dysku.
Firma Apple zdecydowanie zaleca korzystanie os_logz rejestrowania wszelkiego rodzaju wiadomości, w tym informacji, debugowania i komunikatów o błędach, ze względu na znacznie lepszą wydajność w porównaniu do poprzednich systemów rejestrowania oraz scentralizowane gromadzenie danych, które umożliwia programistom wygodne sprawdzanie dzienników i aktywności. W rzeczywistości nowy system prawdopodobnie ma tak mało miejsca, że nie spowoduje „efektu obserwatora”, w którym twój błąd zniknie, jeśli wstawisz komendę rejestrowania, zakłócając czas wystąpienia błędu.
Więcej informacji na ten temat można znaleźć tutaj .
Podsumowując: użyj print()do osobistego debugowania dla wygody (ale wiadomość nie zostanie zarejestrowana po wdrożeniu na urządzeniach użytkowników). Następnie użyj Unified Logging ( os_log) jak najwięcej do wszystkiego innego.
os_log
. Zobacz moją odpowiedź poniżej .os_log
: spróbuj zobaczyć pełną dokumentację strony C celu. Jest o wiele bardziej kompletny .Odpowiedzi:
Kilka różnic:
print
vsprintln
:Do
print
wiadomości druki funkcyjne w konsoli Xcode podczas debugowania aplikacji.println
Jest odmianą tego, który został usunięty w Swift 2 i nie jest stosowane. Jeśli widzisz stary używany kodprintln
, możesz go teraz bezpiecznie zastąpićprint
.W wersji Swift 1.x
print
nie dodawano znaków nowego wiersza na końcu drukowanego ciągu, aprintln
zrobiono to. Ale w dzisiejszych czasachprint
zawsze dodaje znak nowej linii na końcu łańcucha, a jeśli nie chcesz tego robić, podajterminator
parametr""
.NSLog
:NSLog
jest wolniejszy;NSLog
dodaje znacznik czasu i identyfikator do wyniku, natomiastprint
nie;NSLog
instrukcje pojawiają się zarówno w konsoli urządzenia, jak i konsoli debuggera, podczas gdyprint
pojawiają się tylko w konsoli debuggera.NSLog
używaprintf
ciągów formatu -styl, npktóre wytworzą:
W systemie iOS 10 / macOS 10.12 istnieje trzecia alternatywa,
os_log
część systemu „ujednoliconego rejestrowania” (patrz wideo Ujednolicone rejestrowanie i śledzenie aktywności WWDC 2016 ).Musisz zaimportować
os.log
przed użyciemos_log
funkcji:Podobnie
NSLog
,os_log
wyświetli komunikaty zarówno do konsoli debugowania Xcode, jak i konsoli urządzeniaMożesz teraz kontrolować pola „podsystem” i „kategoria” dostępne w aplikacji konsoli. Na przykład:
Gdy obserwujesz aplikację za pomocą zewnętrznej aplikacji konsoli, możesz nie tylko dodać te kolumny do głównego widoku, ale możesz je filtrować na ich podstawie. Jest to bardzo przydatne, gdy chcesz odróżnić wiadomości debugowania od (a) wiadomości generowanych przez inne podsystemy w imieniu Twojej aplikacji; lub (b) wiadomości z innych kategorii lub typów.
Można określić różne typy rejestrowania komunikatów, albo
.info
,.debug
,.error
,.fault
(a.default
):Tak więc, jeśli używasz zewnętrznej aplikacji konsoli, możesz wyświetlać tylko wiadomości niektórych kategorii (np. Pokazywać wiadomości debugowania tylko, jeśli wybierzesz „Uwzględnij komunikaty debugowania” w menu „Akcja” konsoli). Te ustawienia dyktują również wiele subtelnych problemów dotyczących tego, czy rzeczy są zapisywane na dysku, czy nie. Zobacz wideo WWDC, aby uzyskać więcej informacji.
Podczas używania nie można używać interpolacji ciągów
os_log
. Na przykład nie możesz zrobić:Musisz zrobić:
Jednym z powodów powyższego ograniczenia jest wspieranie prywatności danych. Pierwotne typy danych (np. Liczby) są domyślnie publiczne, a obiekty (np. Łańcuchy) są domyślnie prywatne. W poprzednim przykładzie, w którym zarejestrowałeś adres URL, jeśli aplikacja została wywołana z samego urządzenia i oglądałeś z aplikacji konsoli Maca, zobaczysz:
Jeśli chcesz zobaczyć to z urządzenia zewnętrznego, musisz zrobić:
Uwaga:
NSLog
teraz używa ujednoliconego systemu powiadomień za kulisami, ale z następującymi zastrzeżeniami:Nie można kontrolować podsystemu, kategorii lub typu dziennika;
Nie obsługuje ustawień prywatności.
Podsumowując,
print
wystarcza do prostych zadań, aleNSLog
jest użyteczny, ponieważ zawiera informacje o znacznikach czasu.Moc
os_log
debiutu w aplikacjach na iOS, które muszą być testowane poza Xcode, jest ogromna. Na przykład podczas testowania procesów aplikacji iOS w tle, takich jak pobieranie w tle, połączenie z debuggerem Xcode zmienia cykl życia aplikacji . Tak więc często będziesz chciał przetestować na urządzeniu fizycznym, uruchamiając aplikację z samego urządzenia, a nie uruchamiając aplikację z debugera Xcode. Ujednolicone rejestrowanie pozwala nadal oglądaćos_log
wyciągi z urządzenia z iOS w aplikacji MacOS Console.źródło
print
, pokazuje się w obszarze debugowania Xcode, podobnie jakdebugPrint
. Jedyną różnicą jest to, żeprint
kończy siędescription
metoda wywołania obiektu idebugPrint
wywołańdebugDescription
, które mogą być bardziej szczegółowe niżdescription
.Jeśli używasz Swift 2 , teraz możesz tylko print () zapisać coś na wyjściu.
Zaktualizowano do iOS 9
Domyślnie funkcja kończy linię, którą drukuje, dodając podział linii.
Terminator
Aby wydrukować wartość bez podziału wiersza po niej, podaj pusty ciąg jako terminator
Separator
Możesz teraz używać separatora do łączenia wielu elementów
Obie
Lub możesz połączyć używając w ten sposób
źródło
appendNewline
ma wartość domyślnątrue
terminator : ""
, np.print("...", terminator: "")
Co więcej, Swift 2 ma
debugPrint()
(iCustomDebugStringConvertible
protokół)!Nie zapomnij o tym,
debugPrint()
który działa,print()
ale najlepiej nadaje się do debugowania .Przykłady:
print("Hello World!")
staje sięHello World
debugPrint("Hello World!")
staje się"Hello World"
(Cytaty!)print(1..<6)
staje się1..<6
debugPrint(1..<6)
staje sięRange(1..<6)
Każda klasa może dostosować swoją reprezentację ciągu debugowania za pomocą
CustomDebugStringConvertible
protokołu.źródło
DebugPrintable
nazwaCustomDebugStringConvertible
protokołu została zmieniona na protokół .description
jestdebugDescription
jak Pythonastr
jestrepr
?Aby dodać do odpowiedzi Roba, od iOS 10.0 Apple wprowadził zupełnie nowy system „Unified Logging”, który zastępuje istniejące systemy rejestrowania (w tym ASL i Syslog, NSLog), a także przewyższa istniejące metody rejestrowania wydajności, dzięki nowym technikom, w tym kompresja danych dziennika i odroczone zbieranie danych.
Z Apple :
Firma Apple zdecydowanie zaleca korzystanie
os_log
z rejestrowania wszelkiego rodzaju wiadomości, w tym informacji, debugowania i komunikatów o błędach, ze względu na znacznie lepszą wydajność w porównaniu do poprzednich systemów rejestrowania oraz scentralizowane gromadzenie danych, które umożliwia programistom wygodne sprawdzanie dzienników i aktywności. W rzeczywistości nowy system prawdopodobnie ma tak mało miejsca, że nie spowoduje „efektu obserwatora”, w którym twój błąd zniknie, jeśli wstawisz komendę rejestrowania, zakłócając czas wystąpienia błędu.Więcej informacji na ten temat można znaleźć tutaj .
Podsumowując: użyj
print()
do osobistego debugowania dla wygody (ale wiadomość nie zostanie zarejestrowana po wdrożeniu na urządzeniach użytkowników). Następnie użyj Unified Logging (os_log
) jak najwięcej do wszystkiego innego.źródło
Istnieje inna metoda,
dump()
której można również użyć do logowania:Od standardowych funkcji biblioteki Swift
źródło