Ответ 1
Несколько отличий:
-
print
vsprintln
:Функция
print
печатает сообщения в консоли Xcode при отладке приложений.println
- это вариация, которая была удалена в Swift 2 и больше не используется. Если вы видите старый код, который используетprintln
, теперь вы можете спокойно заменить его наprint
.Назад в Swift 1.x,
print
не добавлял символы новой строки в конце напечатанной строки, тогда какprintln
. Но в настоящее времяprint
всегда добавляет символ новой строки в конце строки, и если вы этого не хотите, поставьте параметрterminator
""
. -
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
-
-
Эффективный 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)
Когда вы наблюдаете приложение через внешнее консольное приложение, вы можете не только добавлять эти столбцы к основному виду, но и фильтровать на основе этого. Это очень полезно, когда вы хотите отличить отладочные сообщения от (а) тех, которые генерируются другими подсистемами от имени вашего приложения; или (b) сообщения из других категорий или типов.
-
Вы можете указать разные типы сообщений регистрации:
.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 Console, вы увидите:
url = <private>
Если вы хотите увидеть его с внешнего устройства, вам нужно будет:
os_log("url = %{public}@", url.absoluteString)
-
Примечание.
NSLog
теперь использует единую систему уведомлений за кулисами, но со следующими оговорками:-
Вы не можете управлять подсистемой или типом категории или журнала;
-
Он не поддерживает настройки конфиденциальности.
-
-
Нижняя строка print
достаточна для простых задач, но NSLog
полезна, поскольку она содержит информацию о метке времени для вас.
Сила os_log
приходит в полное облегчение при отладке приложений iOS, которые необходимо протестировать вне Xcode. Например, при тестировании фоновых процессов приложения iOS, таких как фоновое извлечение, подключение к отладчику Xcode изменяет жизненный цикл приложения. Таким образом, вы часто захотите протестировать на физическом устройстве, запуская приложение с самого устройства, не запуская приложение из отладчика Xcodes. Унифицированное ведение журнала позволяет вам просматривать инструкции iOS устройства os_log
из приложения MacOS Console.