Swift: print () vs println () vs NSLog()
Jaka jest różnica między print
, NSLog
i println
i kiedy powinienem używać każdego z nich?
Na przykład, w Pythonie gdybym chciał wydrukować słownik, po prostu print myDict
, ale teraz mam 2 inne opcje. Jak i kiedy należy używać każdego z nich?
5 answers
Kilka różnic:
-
print
vsprintln
:Funkcja
print
wyświetla komunikaty w konsoli Xcode podczas debugowania aplikacji.println
jest odmianą tego, która została usunięta w Swift 2 i nie jest już używana. Jeśli widzisz stary kod, który używaprintln
, możesz teraz bezpiecznie zastąpić goprint
.Z powrotem w Swift 1.x,
print
nie dodało znaków nowej linii na końcu drukowanego ciągu, podczas gdyprintln
tak. Ale obecnie,print
zawsze dodaje znak nowej linii na końcu łańcucha, a jeśli nie chcesz, aby to robił, podaj parametrterminator
""
. -
NSLog
:-
NSLog
jest wolniejszy; -
NSLog
dodaje znacznik czasu i identyfikator do wyjścia, podczas gdyprint
nie będzie; NSLog
polecenia pojawiają się zarówno w konsoli urządzenia, jak i w konsoli debuggera, podczas gdyprint
pojawia się tylko w konsoli debuggera.-
NSLog
zastosowaniaprintf
- style formatowania łańcuchów, np.NSLog("%0.4f", CGFloat.pi)
To da:
2017-06-09 11:57:55.642328-0700 MyApp[28937:1751492] 3.1416
-
-
[42]} skuteczne iOS 10 / macOS 10.12, istnieje trzecia alternatywa,
os_log
, część systemu "zunifikowanego rejestrowania" (zobacz wideo WWDC 2016 zunifikowane rejestrowanie i śledzenie aktywności ).-
Musisz zaimportować
os.log
przed użyciemos_log
funkcji:import os.log
-
Jak
NSLog
,os_log
wyświetla komunikaty zarówno do konsoli debugowania Xcode, jak i do 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 pośrednictwem zewnętrznej aplikacji konsoli, możesz nie tylko dodać te kolumny do głównego widoku, ale możesz filtrować na ich podstawie. Jest to bardzo przydatne, gdy chcemy odróżnić wiadomości debugujące od tych generowanych przez innych podsystemów w imieniu aplikacji; lub (b) wiadomości z innych kategorii lub typów.
-
Możesz określić różne typy wiadomości logowania, albo
.info
,.debug
,.error
,.fault
(lub.default
):os_log("web service did not respond", type: .error)
Tak więc, jeśli korzystasz z zewnętrznej aplikacji konsoli, możesz wybrać wyświetlanie tylko wiadomości określonych kategorii(np. Pokaż tylko wiadomości debugowania, jeśli wybierzesz opcję " Dołącz wiadomości debugowania "w menu" Akcja " konsoli). Ustawienia te dyktują również wiele subtelnych szczegółów problemów o tym, czy rzeczy są rejestrowane na dysku, czy nie. Zobacz wideo WWDC po więcej szczegółów.
-
Nie można używać interpolacji łańcuchów podczas używania
os_log
. Na przykład nie możesz zrobić:os_log("foo \(url.absoluteString)")
Musiałbyś zrobić:
os_log("url = %@", url.absoluteString)
-
Jednym z powodów powyższego ograniczenia jest ochrona prywatności danych. Prymitywne typy danych (np. liczby) są domyślnie publiczne, a obiekty (np. ciągi znaków) 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 komputera Mac, zobaczysz: [43]}
Url =
os_log("url = %{public}@", url.absoluteString)
-
Uwaga,
NSLog
teraz używa zunifikowanego systemu powiadomień za kulisami, ale z następującymi zastrzeżeniami:]}-
Nie można kontrolować podsystemu lub kategorii lub typu dziennika;
Nie obsługuje ustawienia prywatności.
-
-
Podsumowując, print
jest wystarczający do prostych zadań, ale NSLog
jest przydatny, ponieważ zawiera informacje o znaczniku czasu dla Ciebie.
os_log
przychodzi z ulgą podczas debugowania aplikacji iOS, które muszą być testowane poza Xcode. Na przykład podczas testowania w tle aplikacji iOS procesy takie jak pobieranie w tle, podłączenie do debugera Xcode zmienia cykl życia aplikacji. Więc często będziesz chcesz przetestować na urządzeniu fizycznym, uruchamiając aplikację z samego urządzenia, nie uruchamiając aplikacji z debugera Xcode. Unified logging pozwala ci nadal oglądać instrukcje Urządzenia z systemem iOS os_log
z aplikacji konsoli macOS.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 20:16:05
Jeśli używasz Swift 2, Teraz możesz tylko użyć print (), aby napisać coś na wyjście.
Apple połączyło obie funkcje println () i print () w jeden.
Aktualizacja 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 linii po niej, podaj pusty łańcuch jako terminator
print("Hello Swift", terminator: "")
Separator
Możesz teraz użyć separatora do łączenia wielu elementów
print("Hello", "Swift", 2, separator:" ")
Obie
Lub możesz połączyć używając w ten sposób
print("Hello", "Swift", 2, separator:" ", terminator:".")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 13:17:24
Ponadto Swift 2 mA debugPrint()
(i CustomDebugStringConvertible
protokół)!
Nie zapomnij o debugPrint()
który działa jak print()
ale najbardziej nadaje się do debugowania.
Przykłady:
-
struny
-
print("Hello World!")
staje sięHello World
-
debugPrint("Hello World!")
staje się"Hello World"
(Cytaty!)
-
-
zakresy
-
print(1..<6)
staje się1..<6
-
debugPrint(1..<6)
staje sięRange(1..<6)
-
Każda klasa może dostosować ich reprezentacja łańcuchów debugowania poprzez CustomDebugStringConvertible
protokół.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 06:18:29
[3]} aby dodać do odpowiedzi Roba, od iOS 10.0, Apple wprowadziło całkowicie nowy "Zunifikowany system rejestrowania", który zastępuje istniejące systemy rejestrowania (w tym ASL i Syslog, NSLog), a także przewyższa istniejące metody rejestrowania w wydajności, dzięki nowym technikom, w tym kompresji danych dziennika i gromadzenia danych odroczonych.
From Apple :
Zunifikowany system logowania zapewnia jeden, wydajny, wydajny API do przechwytywania wiadomości we wszystkich poziomy systemu. Ten ujednolicony system scentralizuje przechowywanie danych dziennika w pamięci i w magazynie danych na dysku.
Apple zdecydowanie zaleca używanie os_log
w przyszłości do rejestrowania wszelkiego rodzaju komunikatów, w tym informacji, debugowania, komunikatów o błędach ze względu na znacznie lepszą wydajność w porównaniu do poprzednich systemów rejestrowania oraz scentralizowane gromadzenie danych umożliwiających wygodną kontrolę dzienników i aktywności dla programistów. W rzeczywistości nowy system jest prawdopodobnie tak niewielki, że nie będzie spowoduje "efekt obserwatora", w którym błąd zniknie, jeśli wstawisz polecenie logowania, zakłócając czas wystąpienia błędu.
Możesz dowiedzieć się więcej na ten temat w szczegółach tutaj .
Podsumowując: użyj print()
do osobistego debugowania dla wygody (ale wiadomość nie będzie rejestrowana po wdrożeniu na urządzeniach Użytkownika). Następnie użyj Unified Logging (os_log
) w miarę możliwości dla wszystkiego innego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-18 10:24:48
Istnieje inna metoda o nazwie dump()
, która może być również użyta do logowania:
func dump<T>(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)
Zrzuca zawartość obiektu za pomocą jego lustra na standardowe wyjście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-26 16:50:02