it-swarm.com.ru

Swift: печать () против печати () против NSLog ()

В чем разница между print, NSLog и println и когда мне следует использовать каждый из них?

Например, в Python, если бы я хотел напечатать словарь, я бы просто print myDict, но теперь у меня есть 2 других варианта. Как и когда я должен использовать каждый?

400
User

Несколько отличий:

  1. print vs println:

    Функция print печатает сообщения в консоли Xcode при отладке приложений.

    println - это вариант, который был удален в Swift 2 и больше не используется. Если вы видите старый код, который использует println, теперь вы можете смело заменять его на print.

    В Swift 1.x, print не добавлял символы новой строки в конце напечатанной строки, тогда как println сделал. Но в настоящее время print всегда добавляет символ новой строки в конце строки, и если вы не хотите, чтобы это делалось, укажите параметр terminator для "".

  2. NSLog:

    • NSLog медленнее;

    • NSLog добавляет метку времени и идентификатор к выводу, тогда как print не будет;

    • Операторы NSLog появляются как в консоли устройства, так и в консоли отладчика, тогда как print появляется только в консоли отладчика.

    • NSLog использует строки формата printf-, например,.

      NSLog("%0.4f", CGFloat.pi)
      

      что даст:

      2017-06-09 11: 57: 55.642328-0700 MyApp [28937: 1751492] 3.1416

  3. Начиная с iOS 10/macOS 10.12, существует третья альтернатива, os_log, часть системы "унифицированной регистрации" (см. Видео WWDC 2016 Унифицированная регистрация и отслеживание активности ).

    • Вы должны импортировать os.log перед использованием функции os_log:

      import os.log
      
    • Как и NSLog, os_log будет выводить сообщения как на консоль отладки Xcode, так и на консоль устройства.

    • Теперь вы можете контролировать поля "подсистема" и "категория", доступные в консольном приложении. Например:

      let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "network")
      os_log("url = %@", log: log, url.absoluteString)
      

      Когда вы наблюдаете за приложением через внешнее консольное приложение, вы можете не только добавлять эти столбцы в главное представление, но и фильтровать их. Это очень полезно, когда вы хотите отличить ваши сообщения отладки от (а) сообщений, генерируемых другими подсистемами от имени вашего приложения; или (б) сообщения из других категорий или типов.

    • Вы можете указать различные типы сообщений регистрации: .info, .debug, .error, .fault (или .default):

      os_log("web service did not respond", type: .error)
      

      Таким образом, если вы используете внешнее консольное приложение, вы можете выбрать просмотр только сообщений определенных категорий (например, показывать только сообщения отладки, если вы выбрали "Включить отладочные сообщения" в меню "Действие" консоли). Эти настройки также диктуют многие тонкие детали о том, записываются ли данные на диск или нет. Смотрите WWDC видео для более подробной информации.

    • Вы не можете использовать интерполяцию строк при использовании os_log. Например, вы не можете сделать:

      os_log("foo \(url.absoluteString)")
      

      Вы должны сделать:

      os_log("url = %@", url.absoluteString)
      
    • Одной из причин вышеуказанного ограничения является поддержка конфиденциальности данных. Примитивные типы данных (например, числа) являются общедоступными по умолчанию, а объекты (например, строки) являются частными по умолчанию. В предыдущем примере, где вы зарегистрировали URL-адрес, если приложение было вызвано с самого устройства, а вы просматривали его из консольного приложения Mac, вы увидите:

      url = <личное>

      Если вы хотите увидеть его с внешнего устройства, вам нужно сделать:

      os_log("url = %{public}@", url.absoluteString)
      
    • Обратите внимание, что NSLog теперь использует единую систему уведомлений за кулисами, но со следующими оговорками:

      • Вы не можете управлять подсистемой, категорией или типом журнала;

      • Он не поддерживает настройки конфиденциальности.

Итог, print достаточно для простых задач, но NSLog полезен, потому что он содержит информацию о метках времени для вас.

Сила os_log значительно облегчается при отладке приложений iOS, которые должны быть протестированы вне Xcode. Например, при тестировании фоновых процессов приложения iOS, таких как фоновая выборка, при подключении к отладчику Xcode изменяет жизненный цикл приложения . Таким образом, вам часто нужно тестировать на физическом устройстве, запускать приложение с самого устройства, а не запускать приложение из отладчика Xcode. Унифицированное ведение журнала позволяет вам по-прежнему наблюдать операторы os_log вашего устройства iOS из консольного приложения macOS.

664
Rob

Если вы используете Swift 2, теперь вы можете использовать только print () для записи чего-либо в вывод.

Apple объединила обе функции println () и print () в одну.

Обновлено до iOS 9

По умолчанию функция завершает строку, которую печатает, добавляя разрыв строки.

print("Hello Swift")

Терминатор

Чтобы напечатать значение без разрыва строки после него, передайте пустую строку в качестве терминатора

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

сепаратор

Теперь вы можете использовать разделитель для объединения нескольких элементов

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

И

Или вы можете комбинировать использование таким образом

print("Hello", "Swift", 2, separator:" ", terminator:".")
76
Jorge Casariego

Более того, Swift 2 имеет debugPrint()CustomDebugStringConvertible протокол)!

Не забудьте о debugPrint(), который работает как print(), но наиболее подходящий для отладки .

Примеры:

  • Строки
    • print("Hello World!") становится Hello World
    • debugPrint("Hello World!") становится "Hello World" (Цитаты!)
  • Диапазоны
    • print(1..<6) становится 1..<6
    • debugPrint(1..<6) становится Range(1..<6)

Любой класс может настроить свое представление строки отладки через CustomDebugStringConvertible протокол.

60
Valentin Shergin

Чтобы добавить ответ Роба, начиная с iOS 10.0, Apple представила совершенно новую систему "Унифицированная регистрация", которая заменяет существующие системы ведения журнала (включая ASL и Syslog, NSLog), а также превосходит существующие подходы ведения журнала по производительности, благодаря его новым методам, включая сжатие данных журнала и отложенный сбор данных.

От Apple :

Унифицированная система ведения журналов предоставляет единый, эффективный и производительный API для сбора сообщений на всех уровнях системы. Эта унифицированная система централизует хранение данных журнала в памяти и в хранилище данных на диске.

Apple настоятельно рекомендует использовать os_log для регистрации всех видов сообщений, включая информацию, отладку, сообщения об ошибках, из-за своей значительно улучшенной производительности по сравнению с предыдущими системами ведения журналов и централизованного сбора данных, позволяющего удобную проверку журналов и действий для разработчиков. Фактически, новая система, вероятно, настолько мала, что она не вызовет "эффекта наблюдателя", когда ваша ошибка исчезнет, ​​если вы вставите команду регистрации, что будет влиять на время возникновения ошибки.

Performance of Activity Tracing, now part of the new Unified Logging system

Вы можете узнать об этом подробнее здесь .

Подводя итог: используйте print() для вашей личной отладки для удобства (но сообщение не будет зарегистрировано при развертывании на пользовательских устройствах). Затем используйте Unified Logging (os_log) как можно больше для всего остального.

31
HuaTham

Есть еще один метод с именем dump(), который также можно использовать для регистрации:

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

Сбрасывает содержимое объекта с помощью его зеркала на стандартный вывод.

From Swift Стандартные библиотечные функции

3
JAL