首页 > 解决方案 > 基于调试级别的 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 项目中没有效果。有什么问题?

标签: iosswift

解决方案


你可以尝试这样的事情:

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关键字。)


推荐阅读