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

时间:2018-07-10 19:15:33

标签: ios swift cocoalumberjack

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

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

((Action<object, typeof(message)>)handler).Invoke(sender, message);

我仅在罕见的对性能敏感的情况下使用此功能,在这种情况下,我只想基于日志级别执行一些代码块。如果动态日志级别ddLogLevel包含DDLogLevelVerbose(对于DDLogLevelVerbose和DDLogLevelAll为true),则该条件为true。

我该如何在Swift中编写代码?

2 个答案:

答案 0 :(得分:3)

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

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

(添加)

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

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

(Objective-C)

if (ddLogLevel & DDLogFlagVerbose) {
    ...
}

(快速)

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

答案 1 :(得分: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")
}