如何在Swift中使用伐木工人伐木?

如何在Swift中使用伐木工人伐木?,swift,cocoalumberjack,Swift,Cocoalumberjack,我正在将使用Lumberjack登录的Objective-C文件转换为Swift。除了我声明ddloglevel的部分之外,它似乎大部分都在工作 Objective-C实现此目的的方法: #ifdef DEBUG static const int ddLogLevel = LOG_LEVEL_INFO; #else static const int ddLogLevel = LOG_LEVEL_VERBOSE; #endif 捷径: #if DEBUG let ddLogLevel = LOG

我正在将使用Lumberjack登录的Objective-C文件转换为Swift。除了我声明
ddloglevel
的部分之外,它似乎大部分都在工作

Objective-C实现此目的的方法:

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

#if DEBUG
let ddLogLevel = LOG_LEVEL_INFO;
#else
let ddLogLevel = LOG_LEVEL_VERBOSE;
#endif
除了这个编译时错误之外:
使用未解析标识符“LOG\u LEVEL\u INFO”


为什么会这样?如何修复它?

查看库源代码,
LOG\u LEVEL\u INFO
LOG\u LEVEL\u VERBOSE
\define
宏,Swift不会自动导入。Swift只能看到常量

但是,我认为您的方法作为一个整体可能没有意义-看起来您试图为全局目标-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
的预处理器宏。我认为这不是一个很好的匹配。

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


是的,我正在导入
DDLog.h
DDTTYLogger.h
DDLog.h
声明
日志级别。
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)
}