多年来,我一直在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中编写代码?
答案 0 :(得分:3)
我只导入了CocoaLumberjack的一小部分,但这应该与上面的Objective-C代码相同。
if (ddLogLevel.rawValue & DDLogLevel.verbose.rawValue) != 0 {
...
}
(添加)
但是据我检查原始定义,此代码(以及您的Objective-C代码)对所有预定义的日志级别返回true。
您可能需要编写类似的内容才能仅击中DDLogLevelVerbose
和DDLogLevelAll
。
(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")
}