CocoaLumberjack与Swift - 调用预处理宏

8

我开始使用新的编程语言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中工作?或者有没有人尝试过类似的方法并取得更大的成功?
3个回答

12

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

希望这能帮助其他遇到相同问题的人。

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

@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");

你如何定义 ProjectName-Bridging-Header.h?我尝试了 #import <DDLogWrapper.h>,但 Xcode 报告了 file not found 错误。DDLogWrapper.h 在目录 ProjectName/Application/DDLogWrapper.h 中。我还尝试了 Application/DDLogWrapper.h,但也不起作用。我的 Build Settings 中的 SWIFT_OBJC_BRIDGING_HEADER 字段为空,但我没有问题桥接其他模块。 - netwire
根据runios的尝试编辑,您还需要#import "DDLogMacros.h" - admdrew
CocoaLumberjack支持Swift和Objective-C,如果您正在迁移应用程序,请使用pod 'CocoaLumberjack/Swift'。最低要求为iOS8。如果您像我一样被困在支持iOS7的情况下,那么这个工具非常实用。 - mriddle89

6
从2.0.0beta4版本开始,CocoaLumberJack包含一个名为CocoaLumberJack.swift的文件,使其与Swift项目的集成变得非常容易。
它们使用全局变量defaultDebugLevel来设置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")

1
我使用cocoapods 0.36.0.beta.2和lumberjack 2.0.0-rc。我在Pods ▸ CocoaLumberjack ▸ Classes ▸ CocoaLumberjack.swift中有swift文件。在我的项目中的swift文件中,我尝试导入它,但是我得到了“没有这样的模块'CocoaLumberjack'”的错误信息,有什么想法吗? - lawicko
据称,Lumberjack 2.1.0现在支持Swift 2.0。 - John Shelley

5
我创建了一个Swift封装器,用于CocoaLumberjack,可以很好地封装一切。
DDLog.addLogger(DDTTYLogger.sharedInstance())
DDLog.logLevel = .Info

logInfo("Info")
logWarn("Warn")
logDebug("Debug")
logError("Error")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接