7

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

var customLoggerFormatter = CustomLoggerFormatter()

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

但问题是,CocoaLumberjack 库正在为记录器方法使用预处理器宏,例如DDLogVerbose(@"..")

在 DDLog.h 中定义:

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

是否有任何解决方法可以使预处理器定义在 Swift 中工作?或者有没有人尝试过类似的事情并取得了更大的成功?

4

3 回答 3

12

好的,我刚刚找到了解决方案。编写一个调用预处理器的 Objective-C Wrapper 类并提供调用它的方法。

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

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

@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.

使用以下代码,我能够制作一个日志语句:

DDLogWrapper.logVerbose("TEST");
于 2014-06-10T15:24:04.667 回答
5

为 CocoaLumberjack 创建了一个 Swift 包装器,它很好地封装了所有内容。

DDLog.addLogger(DDTTYLogger.sharedInstance())
DDLog.logLevel = .Info

logInfo("Info")
logWarn("Warn")
logDebug("Debug")
logError("Error")
于 2014-08-16T21:45:31.980 回答
5

从 开始2.0.0beta4,CocoaLumberJack 包含一个CocoaLumberJack.swift文件,可以非常轻松地与 Swift 项目集成。

他们使用全局 vardefaultDebugLevel来设置DDLogLevel,您可以快速基本的预编译宏来根据您的需要对其进行自定义。

#if DEBUG
    defaultDebugLevel = DDLogLevel.All
#else
    defaultDebugLevel = DDLogLevel.Warning
#endif

DDLog.addLogger(DDTTYLogger.sharedInstance())
DDLogDebug("Debug")
DDLogInfo("Info")
DDLogWarn("Warning")
DDLogVerbose("Verbose")
DDLogError("Error")
于 2015-01-28T15:20:42.253 回答