为啥 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 中的过滤器会迭代集合两次?

为啥 swift uiview 不会连接到视图控制器?

为啥找不到 Swift 4 语言的 Xcode 目标 c 接口标题名称

为啥我在实现委托以将值从子 swift 类传递给父目标 C 类时出错?

为啥 @noescape 在需要时不会自动应用于 Swift 闭包?

为啥我的覆盖线没有根据极坐标公式(swift,ios)产生我在地图中的期望?