打印,NSLog和println之间的区别是什么,什么时候我应该使用它们?

例如,在Python中,如果我想打印一个字典,我只打印myDict,但现在我有两个其他选择。我应该如何以及何时使用它们?


当前回答

还有另一个方法叫做dump(),也可以用于日志记录:

<T>(T, name:字符串?,缩进:Int, maxDepth: Int, maxItems: Int) 使用对象的镜像将对象的内容转储到标准输出。

来自Swift标准库函数

其他回答

如果你正在使用Swift 2,现在你只能使用print()向输出写入一些东西。

Apple已经将println()和print()函数组合成 一个。

更新至iOS 9

默认情况下,该函数通过添加换行符来结束它打印的行。

print("Hello Swift")

《终结者》

若要打印后面没有换行符的值,请传递一个空字符串作为结束符

print("Hello Swift", terminator: "")

分隔符

现在可以使用分隔符连接多个项

print("Hello", "Swift", 2, separator:" ")

Both

或者你可以这样结合使用

print("Hello", "Swift", 2, separator:" ", terminator:".")

苹果日志

NSLog - add meta info (like timestamp and identifier) and allows you to output 1023 symbols. Also print message into Console. The slowest method. Is not safe because other applications has an access to log file @import Foundation NSLog("SomeString") print - prints all string to Xcode. Has better performance than previous @import Foundation print("SomeString") println (only available Swift v1) and add \n at the end of string os_log (from iOS v10) - prints 32768 symbols also prints to console. Has better performance than previous @import os.log os_log("SomeIntro: %@", log: .default, type: .info, "someString") Logger (from iOS v14) - prints 32768 symbols also prints to console. Has better performance than previous @import os let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "someCategory") logger.log("\(s)")

还有另一个方法叫做dump(),也可以用于日志记录:

<T>(T, name:字符串?,缩进:Int, maxDepth: Int, maxItems: Int) 使用对象的镜像将对象的内容转储到标准输出。

来自Swift标准库函数

为了补充Rob的答案,自iOS 10.0以来,苹果推出了一个全新的“统一日志”系统,取代了现有的日志系统(包括ASL和Syslog, NSLog),并在性能上超越了现有的日志方法,这要归功于它的新技术,包括日志数据压缩和延迟数据收集。

从苹果公司:

统一的日志记录系统提供了一个单一的、高效的、高性能的API,用于跨系统的所有级别捕获消息。这个统一的系统将日志数据集中存储在内存和磁盘上的数据存储中。

Apple强烈建议使用os_log来记录所有类型的消息,包括信息、调试和错误消息,因为与以前的日志系统相比,它的性能有了很大的提高,而且它的集中式数据收集可以方便地为开发人员进行日志和活动检查。事实上,新系统的占用空间很可能很低,如果您插入一个日志记录命令,就不会导致错误消失的“观察者效应”,从而干扰错误发生的时间。

你可以在这里了解更多细节。

总结一下:为方便起见,使用print()进行个人调试(但在用户设备上部署时,消息不会被记录)。然后,对于其他所有内容,尽可能使用统一日志记录(os_log)。

此外,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协议自定义调试字符串表示。