ios - 基于调试级别的 Swift NSLog 启用

标签 ios swift

在 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/

相关文章:

ios - NSURLSession 下载任务在成功后失败

ios - 使用 resizeableImageWithCapInsets 平铺 UIImageView :resizingMode?

sqlite - Swift - Apple Mach-O 链接器错误 sqlite3 本地数据库

swift - 尝试获取核心数据中的对象时出错 "-[__NSArrayI entity] : unrecognized selector sent to instance"

iphone - UITableview 基于滚动添加表格单元格

ios - 如何从 iOS 中的 XMPP 服务器删除特定用户的聊天记录?

ios - 应用内购买 ios 购买所有选项

ios - 不使用 cocoapods 安装

swift - 如何以 littleEndian 方式在 Swift 中对 NSData 输出进行字节反转?

IOS 呈现 PageViewController