【问题标题】:CocoaLumberjack Swift - Check if log level includes .verboseCocoaLumberjack Swift - 检查日志级别是否包含 .verbose
【发布时间】:2018-07-10 19:15:33
【问题描述】:

多年来,我一直在 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 为 true),则该条件为真。

如何在 Swift 中编写这个?

【问题讨论】:

标签: ios swift cocoalumberjack


【解决方案1】:

我只导入了 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 {
    ...
}

【讨论】:

    【解决方案2】:

    这里使用的快捷方式是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")
    }
    

    【讨论】:

    • (已更正)我相信您可以将扩展名定义为var flag: DDLogFlag {return DDLogFlag(rawValue: self.rawValue)}。检查代码不等同于 OP 的代码,但您的代码似乎是正确的答案。
    • 我知道必须有更简单的方法来做到这一点!我正在更新我的答案,谢谢!
    • @XML 和 @OOPer 感谢您帮助我了解标志和日志级别之间的关系。我选择了if DDLogFlag(ddLogLevel).contains(.verbose),相当于上面的。
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2014-10-23
    • 2016-11-19
    • 2019-12-13
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多