我正在将使用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'
为什么会这样?我该如何解决?
答案 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_INFO
和LOG_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
的预处理器宏。我不认为这是一场很好的比赛。