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 WorlddebugPrint("Hello World!")становится"Hello World"(цитаты!)- диапазоны
print(1..<6)будет1..<6debugPrint(1..<6)становитсяRange(1..<6)любой класс может настроить свое отладочное строковое представление через
CustomDebugStringConvertibleпротокол.
чтобы добавить к ответу Роба, начиная с iOS 10.0, Apple представила совершенно новую систему "унифицированного ведения журнала", которая заменяет существующие системы ведения журнала (включая ASL и Syslog, NSLog), а также превосходит существующие подходы к ведению журнала по производительности, благодаря своим новым методам, включая сжатие данных журнала и отложенный сбор данных.
С Яблоко:
унифицированная система регистрации предоставляет единый, эффективный, производительный API для захват сообщений на всех уровнях системы. Эта унифицированная система централизует хранение данных журнала в памяти и в хранилище данных на диске.
компания Apple настоятельно рекомендует использовать
os_logпереход к регистрации всех видов сообщений, включая информацию, отладку, сообщения об ошибках из-за его значительно улучшенной производительности по сравнению с предыдущими системами ведения журнала, а также его централизованный сбор данных, позволяющий удобно регистрировать и проверять активность для разработчиков. По сути, новая система вероятно, настолько низкий след, что он не вызовет "эффект наблюдателя", где ваша ошибка исчезает, если вы вставляете команду ведения журнала, мешая времени возникновения ошибки.вы можете узнать больше об этом в деталях здесь.
чтобы подвести итог: используйте
print()для вашей личной отладки для удобства (но сообщение не будет регистрироваться при развертывании на пользовательских устройствах). Затем используйте унифицированное ведение журнала (os_log) Как возможно для всего остального.
