为了账号安全,请及时绑定邮箱和手机立即绑定

斯威夫特:print()vs println()vs NSLog()

斯威夫特:print()vs println()vs NSLog()

江户川乱折腾 2019-11-21 12:55:43
什么之间的区别print,NSLog以及println何时该使用的呢?例如,在Python中,如果我想打印字典,我只是print myDict,但是现在有2个其他选项。我应该如何以及何时使用它们?
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

一些区别:


printvs println:


print调试应用程序时,该函数在Xcode控制台中打印消息。


这println是Swift 2中已删除且不再使用的变体。如果看到正在使用的旧代码,则println现在可以安全地将其替换为print。


回到Swift 1.x,print没有在打印字符串的末尾添加换行符,而是添加了换行符println。但如今,请print始终在字符串的末尾添加换行符,如果您不希望这样做,请提供terminator参数""。


NSLog:


NSLog 更慢


NSLog在输出中添加时间戳和标识符,而print不会;


NSLog语句同时出现在设备的控制台和调试器的控制台中,而print仅出现在调试器的控制台中。


NSLog使用printf-style格式的字符串,例如


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)

通过外部控制台应用程序观察该应用程序时,不仅可以将这些列添加到主视图,还可以基于这些列进行过滤。想要将调试消息与(a)其他子系统代表您的应用程序生成的消息区分开来时,这非常有用。或(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 = <私人>


如果要从外部设备查看它,则必须执行以下操作:


os_log("url = %{public}@", url.absoluteString)

注意,NSLog现在在幕后使用统一通知系统,但有以下警告:


您无法控制子系统,类别或日志类型;


它不支持隐私设置。


底线print足以完成简单的任务,但NSLog很有用,因为它包含了您的时间戳信息。


的功率os_log调试具有的Xcode以外的地方进行测试iOS应用程序,当进入鲜明的救济。例如,当测试后台iOS应用程序进程(例如后台获取)时,连接到Xcode调试器会更改应用程序生命周期。因此,您经常需要在物理设备上进行测试,而不是从Xcode的调试器启动应用程序,而是从设备本身运行应用程序。统一日志记录使您仍然可以os_log从macOS控制台应用程序观看iOS设备语句。


查看完整回答
反对 回复 2019-11-21
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

如果您使用的是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:".")


查看完整回答
反对 回复 2019-11-21
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

而且,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协议自定义其调试字符串表示形式。


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信