Swift: print () vs println () vs NSLog()
В чем разница между print
,NSLog
и println
и когда я должен использовать каждый?
например, в Python, если бы я хотел напечатать словарь, я бы просто print myDict
, но теперь у меня есть 2 другие варианты. Как и когда я должен использовать каждый?
5 ответов:
есть несколько отличий:
println
:The
The
println
это вариант этого, который был удален в Swift 2 и больше не используется. Если вы видите старый код, который используетprintln
, теперь вы можете безопасно заменить его наназад в Swift 1.x,
println
сделал. Но в наши дни,""
.
NSLog
:
NSLog
медленнее;
NSLog
добавляет метку времени и идентификатор продукции, в то время как
NSLog
инструкции отображаются в обоих устройствах консоль и консоль отладчика, тогда как
NSLog
используетprintf
стиль форматирования, например,NSLog("%0.4f", CGFloat.pi)
что будет производить:
2017-06-09 11:57:55.642328-0700 MyApp[28937: 1751492] 3.1416
эффективная 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
теперь использует единую систему уведомления за кулисами, но со следующими оговорками:
вы не можете управлять подсистемой, категорией или типом журнала;
он не поддерживает конфиденциальность настройки.
нижняя линия,
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
переход к регистрации всех видов сообщений, включая информацию, отладку, сообщения об ошибках из-за его значительно улучшенной производительности по сравнению с предыдущими системами ведения журнала, а также его централизованный сбор данных, позволяющий удобно регистрировать и проверять активность для разработчиков. По сути, новая система вероятно, настолько низкий след, что он не вызовет "эффект наблюдателя", где ваша ошибка исчезает, если вы вставляете команду ведения журнала, мешая времени возникновения ошибки.вы можете узнать больше об этом в деталях здесь.
чтобы подвести итог: используйте
print()
для вашей личной отладки для удобства (но сообщение не будет регистрироваться при развертывании на пользовательских устройствах). Затем используйте унифицированное ведение журнала (os_log
) Как возможно для всего остального.