你如何在Swift中使用Lumberjack登录?

时间:2014-07-12 23:17:24

标签: swift lumberjack

我正在将使用Lumberjack Logging的Objective-C文件转换为Swift。它似乎主要是工作,除了我声明ddloglevel的部分。

Objective-C方法:

#ifdef DEBUG
static const int ddLogLevel = LOG_LEVEL_INFO;
#else
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#endif

Swift方式:

#if DEBUG
let ddLogLevel = LOG_LEVEL_INFO;
#else
let ddLogLevel = LOG_LEVEL_VERBOSE;
#endif

除了我编译时错误:Use of unresolved identifier 'LOG_LEVEL_INFO'

为什么会这样?我该如何解决?

2 个答案:

答案 0 :(得分:5)

您可以使用变通方法。您可以显式设置所有Logger的日志记录级别,而不是全局设置logLevel(仅在Objective-C中可用)。 例如:

class LoggerFactory {
#if DEBUG
  static let defaultLogLevel: DDLogLevel = DDLogLevel.All
#else
  static let defaultLogLevel: DDLogLevel = DDLogLevel.Info
#endif

static func initLogging() {
  DDLog.addLogger(DDTTYLogger.sharedInstance(), withLevel: defaultLogLevel)
  DDLog.addLogger(DDASLLogger.sharedInstance(), withLevel: defaultLogLevel)
}

答案 1 :(得分:2)

查看图书馆来源,LOG_LEVEL_INFOLOG_LEVEL_VERBOSE#define个宏,Swift不会自动导入这些宏。斯威夫特只看到const的。

但是,我认为你的方法整体可能没有意义 - 看起来你正在尝试为全局Objective-C常量ddLogLevel赋值。 Swift的let不会为你做那件事 - 它是一个完全不同的命名空间。这是在Swift中无法使用Objective-C宏的基础。

最好的办法是在项目中保留一个Objective-C文件(例如,名为LoggingConfig.m,只包含:

#import "DDLog.h"

#ifdef DEBUG
static const int ddLogLevel = LOG_LEVEL_INFO;
#else
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#endif

您使用的库在很大程度上依赖于Objective-C功能,因此最好只使用Objective-C进行配置。

编辑:更详细地看一下这个库(我之前从未听说过),在Swift中使用CocoaLumberjack可能不会有用,因为它的主要API是名为DDLog的预处理器宏。我不认为这是一场很好的比赛。

相关问题