CocoaLumberjack Swift - 检查日志级别是否包含 .verbose

CocoaLumberjack Swift - Check if log level includes .verbose

多年来我一直在 Swift 和 Obj-C 中使用 CocoaLumberjack 和 pod 'CocoaLumberjack/Swift'。

我正在将代码从 Obj-C 转换为 Swift,但不知道如何将其转换为 Swift:

- (void)functionThatGetsCalledAlot {
  if (ddLogLevel & DDLogLevelVerbose) {
      DDLogVerbose(@"Log message");
      ...Many more log statements...
  }
}

我只在极少数对性能敏感的情况下使用它,在这些情况下,我只想根据日志级别执行一些代码块。如果动态日志级别 ddLogLevel 包含 DDLogLevelVerbose,则条件将为真,这对于 DDLogLevelVerbose 和 DDLogLevelAll 为真。

如何在 Swift 中写这个?

我只导入了 CocoaLumberjack 的一小部分,但这应该与上面的 Objective-C 代码相同。

if (ddLogLevel.rawValue & DDLogLevel.verbose.rawValue) != 0 {
    ...    
}

(添加)

但据我检查原始定义,此代码(和您的 Objective-C 代码)returns 对于所有预定义的日志级别都是正确的。

您可能需要编写类似这样的内容才能仅命中 DDLogLevelVerboseDDLogLevelAll

(Objective-C)

if (ddLogLevel & DDLogFlagVerbose) {
    ...
}

(Swift)

if (ddLogLevel.rawValue & DDLogFlag.verbose.rawValue) != 0 {
    ...
}

这里使用的快捷方式是 OptionSet type。日志级别非常适合这个,但不幸的是,在这种情况下,它作为枚举从 ObjC 桥接。

由于底层DDLogFlag符合OptionSet,我们可以构建一个解决方法:

extension DDLogLevel {
    var flag: DDLogFlag {
        return DDLogFlag(rawValue: rawValue)
    }
}

然后可以这样使用:

let logLevel = DDLogLevel.all

if logLevel.flag.contains(.verbose) {
    print("Verbose is on")
}