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?

Author: Honey, 2014-09-20

5 answers

Kilka różnic:

  1. print vs println:

    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żywa println, możesz teraz bezpiecznie zastąpić go print.

    Z powrotem w Swift 1.x, print nie dodało znaków nowej linii na końcu drukowanego ciągu, podczas gdy println tak. Ale obecnie, print zawsze dodaje znak nowej linii na końcu łańcucha, a jeśli nie chcesz, aby to robił, podaj parametr terminator "".

  2. NSLog:

    • NSLog jest wolniejszy;

    • NSLog dodaje znacznik czasu i identyfikator do wyjścia, podczas gdy print nie będzie;

    • NSLog polecenia pojawiają się zarówno w konsoli urządzenia, jak i w konsoli debuggera, podczas gdy print pojawia się tylko w konsoli debuggera.

    • NSLog zastosowania printf - 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

  3. [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życiem os_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 =

      Jeśli chcesz zobaczyć go z zewnętrznego urządzenia, musisz to zrobić:]}
      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.

[42]}moc 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.
 594
Author: Rob,
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:".")
 70
Author: Jorge Casariego,
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ół.

 57
Author: Valentin Shergin,
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.

Wydajność śledzenia aktywności, teraz część Nowego ujednoliconego systemu rejestrowania

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.

 23
Author: HuaTham,
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.

From Swift Standard Library Functions

 2
Author: JAL,
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