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

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

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

5 ответов


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

  1. print vs println:

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

    на 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")

Терминатор

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

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 Стандартные Функции Библиотеки