Swift: print () vs println () vs NSLog()


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

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

5 355

5 ответов:

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

  1. print vs println:

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

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

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

  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 перед использованием :

      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. Единого входа позволяет вам смотреть ваши iOS устройства os_log инструкции из консольного приложения macOS.

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

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

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

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

print("Hello Swift")

Терминатор

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

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

разделитель

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

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

и

или вы могли бы объединить, используя таким образом

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

кроме того, 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 протокол.

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

С Яблоко:

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

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

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

вы можете узнать больше об этом в деталях здесь.

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

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

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

сбрасывает содержимое объекта, используя его зеркало для стандартного вывода.

С Функции Стандартной Библиотеки Swift