CocoaLumberjack与Swift – 调用预处理器macros

我开始用新的编程语言Swift构build一个IOS应用程序。 我设法使用CocoaPods,并能够在我的AppDelegate.swift中使用我的CustomLoggerFormatter(Objective-C)成功创buildDDTTYLogger,并将其附加到logging器中。

var customLoggerFormatter = CustomLoggerFormatter() var consoleLogger: DDTTYLogger = DDTTYLogger.sharedInstance() consoleLogger.setLogFormatter(customLoggerFormatter) DDLog.addLogger(consoleLogger) 

但问题是,CocoaLumberjack库正在使用预处理器macros的logging器方法,如DDLogVerbose(@"..")

在DDLog.h中定义的是:

 #define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) 

是否有任何解决方法使预处理器在Swift中定义工作? 还是有人尝试过类似的更成功?

好的,我刚刚find了一个解决scheme。 编写一个调用预处理器的Objective-C包装类,并提供调用它的方法。

希望这会帮助其他人面临同样的问题。

我首先创build了一个头文件:

 @interface DDLogWrapper : NSObject + (void) logVerbose:(NSString *)message; + (void) logError:(NSString *)message; + (void) logInfo:(NSString *)message; @end 

与相应的实现:

 #import <Foundation/Foundation.h> #import "DDLogWrapper.h" // Logging Framework Lumberjack #import "DDLog.h" #import "DDASLLogger.h" #import "DDTTYLogger.h" // Definition of the current log level #ifdef DEBUG static const int ddLogLevel = LOG_LEVEL_VERBOSE; #else static const int ddLogLevel = LOG_LEVEL_ERROR; #endif @implementation DDLogWrapper + (void) logVerbose:(NSString *)message { DDLogVerbose(message); } + (void) logError:(NSString *)message { DDLogError(message); } + (void) logInfo:(NSString *)message { DDLogInfo(message); } @end 

重要的是将DDLogWrapper.h文件添加到ProjectName-Bridging-Header.h文件中,然后您可以在Swift中实例化DDLogWrapper并调用logVerbose, logError, logInfo. logError和logVerbose, logError, logInfo.方法logVerbose, logError, logInfo.

用下面的代码我可以做一个日志语句:

 DDLogWrapper.logVerbose("TEST"); 

我为CocoaLumberjack创build了一个Swift包装器,它很好地封装了一切。

 DDLog.addLogger(DDTTYLogger.sharedInstance()) DDLog.logLevel = .Info logInfo("Info") logWarn("Warn") logDebug("Debug") logError("Error") 

2.0.0beta4 ,CocoaLumberJack包含一个CocoaLumberJack.swift文件,可以很容易地与Swift项目集成。

他们使用一个全局DDLogLevel defaultDebugLevel来设置DDLogLevel ,并且你可以使用基本的预编译macros来自定义它以满足你的需求。

 #if DEBUG defaultDebugLevel = DDLogLevel.All #else defaultDebugLevel = DDLogLevel.Warning #endif DDLog.addLogger(DDTTYLogger.sharedInstance()) DDLogDebug("Debug") DDLogInfo("Info") DDLogWarn("Warning") DDLogVerbose("Verbose") DDLogError("Error")