在 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 中,你只能提供条件编译 flags 并且你只能测试这些标志是否存在(它们不能被赋值)。此外,你不能在代码中创建这些标志(没有#定义
)。这些标志必须发送到编译器的命令行(例如:-DDEBUG
)。查看 this question 的最佳答案获取更多信息。
Swift 默认不提供 DEBUG
标志,您需要在项目/目标的构建选项中设置它。有关详细信息,请参阅上面链接的问题。
DEBUG
标志适用于条件编译,但不适用于您的日志级别。为此,通常的做法是使用常量(通过 let
关键字。)
关于ios - 基于调试级别的 Swift NSLog 启用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57418693/