Swift如何打印变量名?求便捷调试打印的内置方案或实现方法
Swift 变量名+值快速打印方案
1. 内置函数是否存在?
没有。Swift标准库的print()需要手动拼接变量名与值,dump()侧重输出对象的完整结构,均无法直接实现printVar(myVar)这种仅传入变量就输出"变量名: 值"的需求。
2. 自定义实现方案
推荐:Swift 5.9+ 宏方案
宏可以直接获取传入参数的源代码文本,完美解决变量名转字符串的问题,且调用方式完全符合预期。
单变量打印宏
先在主目标中定义宏声明:
@freestanding(expression) public macro printVar<T>(_ value: T) -> Void = #externalMacro(module: "YourMacroModule", type: "PrintVarMacro")
在宏目标中实现宏逻辑:
public struct PrintVarMacro: ExpressionMacro { public static func expansion( of node: some FreestandingMacroExpansionSyntax, in context: some MacroExpansionContext ) throws -> ExprSyntax { guard let arg = node.arguments.first?.expression else { throw MacroError.missingArgument } let varName = arg.description return """ print("\(varName): \\(\\(arg))") """ } } enum MacroError: Error { case missingArgument }
多变量打印宏
先声明宏:
@freestanding(expression) public macro printVars(_ values: Any...) -> Void = #externalMacro(module: "YourMacroModule", type: "PrintVarsMacro")
宏实现代码:
public struct PrintVarsMacro: ExpressionMacro { public static func expansion( of node: some FreestandingMacroExpansionSyntax, in context: some MacroExpansionContext ) throws -> ExprSyntax { let printLines = node.arguments.map { arg in let varName = arg.expression.description return "print(\"\(varName): \\(\\(arg.expression))\")" }.joined(separator: "\n") return ExprSyntax(printLines) } }
使用示例
let myVar = 20 let myOtherVar = MyEnum.myCase let myThirdVar = "Arthur" printVar(myVar) // 输出:myVar: 20 printVars(myVar, myOtherVar, myThirdVar) // 输出: // myVar: 20 // myOtherVar: MyEnum.myCase // myThirdVar: "Arthur"
兼容旧版本:编译指令辅助方案
如果无法使用宏,可以用自定义操作符简化,但需要手动传入变量名字符串,示例:
infix operator =>: AssignmentPrecedence func => <T>(name: String, value: T) { print("\(name): \(value)") } // 调用方式 "myVar" => myVar // 输出:myVar: 20
这种方法不如宏便捷,仅作为降级方案。
内容的提问来源于stack exchange,提问作者KPM
相关产品推荐
相关产品推荐

