Swift中如何通过运行时崩溃强制使用debugPrint而非print()?
关于管控print/NSLog使用的团队规范方案
嘿,针对你提到的「能不能让App调用print()时崩溃,以此强制团队用debugPrint()」的需求,我来梳理下实际可行的方案和关键细节:
首先,理论上确实可以重写print()让它崩溃——比如在Swift里这么写:
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") { preconditionFailure("STOP using print() — 请用debugPrint()替代!") }
但实际用下来,这么做其实有点过度,而且我们后来发现,真正需要管控的不是print(),而是NSLog()——这得从两者的输出行为差异说起。
重要更新(2018年5月25日):print和NSLog的输出区别
根据matt的验证,这两个函数的日志输出位置完全不同:
print()的输出只会出现在LLDB调试控制台,真机的设备实时控制台里根本看不到;NSLog()的输出会直接显示在设备控制台,哪怕是Release构建也会留下日志,这才是真正可能造成冗余日志污染的问题点。
所以团队规范的重心应该调整为:
- Debug环境下,优先用
debugPrint()替代print()(前者会输出更清晰的调试信息,不会和其他系统日志混淆); - Release环境下,彻底禁用
NSLog(),避免不必要的日志泄露或干扰。
直接可用的代码实现
针对Release环境禁用NSLog(),你可以在项目里添加这段代码:
#if DEBUG #else public func NSLog(_ format: String, _ args: CVarArg...) { } #endif
这段代码的逻辑很简单:只有在Debug构建时保留NSLog()的原有功能,Release构建时把它替换成空实现——调用它不会产生任何日志输出。至于print(),因为Release下不会影响设备控制台,所以完全没必要处理。
内容的提问来源于stack exchange,提问作者Anton Tropashko
相关产品推荐
相关产品推荐

