You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 02:53:10