如何在Swift自定义print包装函数中获取调用处的行号
如何在Swift自定义print包装函数中获取调用处的行号
这个问题我之前也踩过坑!其实Swift早就给我们准备好了解决方案——把#line(还有#file、#function这类特殊字面量)作为默认参数传入你的包装函数就可以了,这样它们会在函数的调用位置求值,而不是函数定义的地方。
修改后的代码可以这样写:
// 优化后的print包装函数 func dbug(_ things: Any..., line: Int = #line, file: String = #file, function: String = #function) { // 可选:把文件名简化成只显示最后一部分,输出更清爽 let shortFileName = (file as NSString).lastPathComponent print("\(shortFileName):\(line) [\(function)]:", things.map{"\($0)"}.joined(separator: ", ")) } // 调用时完全不用额外传参,直接用就行 dbug("hello", 23)
如果你只需要行号,不需要文件名和函数名,也可以简化成更轻量的版本:
func dbug(_ things: Any..., line: Int = #line) { print("\(line):", things.map{"\($0)"}.joined(separator: ", ")) }
原理很简单:Swift的#line、#file这些特殊字面量,当作为函数的默认参数时,会在调用该函数的代码行上解析求值,而不是函数自身定义的那一行。这样你拿到的行号就正好是调用dbug的位置啦,完美解决你的问题~
备注:内容来源于stack exchange,提问作者Manngo
相关产品推荐
相关产品推荐

