0

多年来,我一直在 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 中写这个?

4

2 回答 2

3

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

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

(添加)

但就我检查原始定义而言,此代码(以及您的 Objective-C 代码)对于所有预定义的日志级别都返回 true。

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

(目标-C)

if (ddLogLevel & DDLogFlagVerbose) {
    ...
}

(迅速)

if (ddLogLevel.rawValue & DDLogFlag.verbose.rawValue) != 0 {
    ...
}
于 2018-07-10T20:23:36.700 回答
2

在这里使用的 swifty 将是OptionSet 类型。日志级别非常适合这种情况,但不幸的是,在这种情况下,它是作为枚举从 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")
}
于 2018-07-10T21:31:25.707 回答