为啥 Swift 中的 print() 不会在目标 C 中将时间戳记录为 NSLog
Posted
技术标签:
【中文标题】为啥 Swift 中的 print() 不会在目标 C 中将时间戳记录为 NSLog【英文标题】:Why print() in Swift does not log the time stamp as NSLog in objective C为什么 Swift 中的 print() 不会在目标 C 中将时间戳记录为 NSLog 【发布时间】:2016-01-26 15:48:32 【问题描述】:当我使用 NSLog()
时,从 Objective C 的背景开始,它会在文本前面加上日期时间戳,但是当我在 Swift 上使用 print()
时,它只会打印文本
所以有办法让它也打印时间戳,还是我做错了什么?
【问题讨论】:
我不是特别确定,但我很确定这与NSLog
打印到控制台(并且您的日志在 Console.app 中可见)但 @987654325 的事实有关Swift 中的 @ 不会那样做。
我没有证据支持第二点,但我相信 Xcode 实际上从控制台获取信息并打印某个类别中的所有内容,即使它与您正在运行的程序无关。我在 Xcode 中看到了一些不相关的控制台消息。也许 Swift 的 print
只是打印到 Xcode 控制台?
检查这个问题:***.com/questions/25951195/…
请注意,无论您选择哪种解决方案,NSLog
将在发布版本中将输出打印到控制台,而 print
不会。明智地选择。
【参考方案1】:
因为print
不是NSLog
。就这么简单。
NSLog
是 Foundation 中的一个日志工具,它写入出现在控制台上的 Apple 系统日志工具。
print(…)
是 Swift 标准库中的一个打印函数,它写入标准输出,在调试会话中显示在控制台上。
您可以将Date()
添加到您的print
参数以打印当前时间和日期。 (或Date().description(with: Locale.current)
以获取您当地的时区。)
或者你也可以使用NSLog
,它也可以在 Swift 中使用(如果你导入 Foundation)。
【讨论】:
谢谢,我试过NSLog
,它可以工作,所以我会在需要显示时间戳的情况下使用它【参考方案2】:
斯威夫特:
NSLog("this will print with dates")
【讨论】:
但不在 Playground 中打印 @Asike 你试过导入 Foundation 吗?无论如何,谢谢你的提示。 @Tillus 你试过导入 Foundation 吗?这仅在存在 obj-c 运行时才有效,在操场上则不然。 是的,与实施基础相同。我认为现在应该使用 OSLog【参考方案3】:这只是输出一个简单的时间戳,但如果需要,可以轻松修改以包含其他文本。
此外,它依赖于 lazy
DateFormatter
来避免昂贵的初始化。
import Foundation
class Timestamp
lazy var dateFormatter: DateFormatter =
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS "
return formatter
()
func printTimestamp()
print(dateFormatter.string(from: Date()))
let timestamp = Timestamp()
timestamp.printTimestamp() // 2018-07-05 12:57:08.725
timestamp.printTimestamp() // 2018-07-05 12:57:08.727 (uses the same formatter)
【讨论】:
这是正确答案之一。请注意,NSLog
将在发布版本中将输出打印到控制台,而 print
不会。【参考方案4】:
这是一个建议的函数,您可以使用它来代替 print()
func printLog(log: AnyObject?)
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS "
print(formatter.stringFromDate(NSDate()), terminator: "")
if log == nil
print("nil")
else
print(log!)
【讨论】:
创建 NSDateFormatter 的实例成本很高。因此,理想情况下,formatter
只需在您的方法之外创建一次,以避免每次调用该方法时都调用 NSDateFormatter()。
这与您想要的无关 - 在这种情况下,应该这样做。【参考方案5】:
您可以在 Swift 中使用 Logging
os 模块来执行此操作:https://developer.apple.com/documentation/os/logging
具体os_log
:https://developer.apple.com/documentation/os/2320718-os_log
import os.log
os_log("Message %d", type: .info, value)
【讨论】:
【参考方案6】:制作您自己的打印类函数,例如 printWithDate() 并将日期添加到输出中。然后您可以在任何地方使用它,而无需每次打印时都添加日期。
【讨论】:
以上是关于为啥 Swift 中的 print() 不会在目标 C 中将时间戳记录为 NSLog的主要内容,如果未能解决你的问题,请参考以下文章
为啥找不到 Swift 4 语言的 Xcode 目标 c 接口标题名称
为啥我在实现委托以将值从子 swift 类传递给父目标 C 类时出错?