ios - 基于调试级别的 Swift NSLog 启用
问题描述
在 Objective C 中,我通过将其放入 .pch 文件中定义了各种级别的日志记录:
#ifdef MY_DEBUG
#define LOG_LEVEL 2
#define MyLog(...) { if(LOG_LEVEL <= 0) NSLog(__VA_ARGS__); }
#define MyLog1(...) { if(LOG_LEVEL <= 1) NSLog(__VA_ARGS__); }
#define MyLog2(...) { if(LOG_LEVEL <= 2) NSLog(__VA_ARGS__); }
#define MyLog3(...) { if(LOG_LEVEL <= 3) NSLog(__VA_ARGS__); }
#define MyLog4(...) { if(LOG_LEVEL <= 4) NSLog(__VA_ARGS__); }
#else
#define MyLog(...)
#define MyLog1(...)
#define MyLog2(...)
#define MyLog3(...)
#define MyLog4(...)
#endif
如何在 Swift 中实现相同的目标?同样在 Xcode 10.3 中,我尝试在 DEBUG 版本的预处理器宏中定义 MY_DEBUG,但它在我的 Swift 项目中没有效果。有什么问题?
解决方案
你可以尝试这样的事情:
public let kMyLogLevel = 2
#if DEBUG
public func MyLog(text: String) { if kMyLogLevel <= 0 { NSLog(text) } }
public func MyLog1(text: String) { if kMyLogLevel <= 1 { NSLog(text) } }
public func MyLog2(text: String) { if kMyLogLevel <= 2 { NSLog(text) } }
public func MyLog3(text: String) { if kMyLogLevel <= 3 { NSLog(text) } }
public func MyLog4(text: String) { if kMyLogLevel <= 4 { NSLog(text) } }
public func MyLog5(text: String) { if kMyLogLevel <= 5 { NSLog(text) } }
#else
public func MyLog(text: String) { }
public func MyLog1(text: String) { }
public func MyLog2(text: String) { }
public func MyLog3(text: String) { }
public func MyLog4(text: String) { }
public func MyLog5(text: String) { }
#endif
这可以放在文件范围内的任何模块中(即,不在类或其他类型中。)
请注意,输入不是变量参数列表,而是简单的文本字符串。Swift 的方法是使用字符串插值,如下所示:
MyLog("The value is: \(value)")
此外,Swift 不像您使用 Objective-C 那样支持预处理器宏。在 Swift 中,您只能提供条件编译标志,并且您只能测试这些标志是否存在(它们不能被赋值。)此外,您不能在代码中创建这些标志(没有#define
)。这些标志必须发送到编译器的命令行(例如:)-DDEBUG
。有关更多信息,请参阅此问题的最佳答案。
Swift 默认不提供DEBUG
标志,您需要在项目/目标的构建选项中设置它。有关详细信息,请参阅上面链接的问题。
该DEBUG
标志适用于条件编译,但不适用于您的日志级别。为此,通常的做法是使用常量(通过let
关键字。)