如何在Swift中打印变量名?

e4eetjau  于 2024-01-05  发布在  Swift
关注(0)|答案(1)|浏览(207)

我经常发现自己输入像print("myVar: \(myVar)")这样的调试打印,当我想打印几个这样的变量时,编写它变得乏味。
我想写一个函数(如果是内置的,就使用它),它只需要我输入一次名字,比如printVar(myVar),如果myVar的值是20,它就会打印myVar: 20
所以我的问题是:

  • 你知道有一个内置的Swift函数已经提供了这样的功能吗?我是一个经验丰富的Swift开发人员,我从来没有听说过这样的事情,我也搜索了文档,谷歌和StackOverflow,都没有用-不,dump()不做这项工作
  • 否则,你知道如何获取字符串形式的变量 name 吗?
  • 镜像或KeyPaths都不合适,它们只处理声明类型的属性名,而不是变量名。我也不想改变我的代码架构来添加日志,所以为此目的声明一个结构不是一个有效的答案。
  • 我也搜索了宏,但我对它们的可能性只有最少的了解。

如果我有这个,我甚至可以写一个变元函数,然后只需输入一个简洁的

  1. printVars(myVar, myOtherVar, myThirdVar)

字符串
得到一个漂亮的日志,这将是一个真正节省时间:

  1. myVar: 20
  2. myOtherVar: MyEnum.myCase
  3. myThirdVar: "Arthur"

i86rm4rw

i86rm4rw1#

如果你不介意使用宏,你可以写一个独立的表达式宏,如下所示:

  1. public struct PrintWithVariableName: ExpressionMacro {
  2. public static func expansion(
  3. of node: some FreestandingMacroExpansionSyntax,
  4. in context: some MacroExpansionContext
  5. ) throws -> ExprSyntax {
  6. let argExpressions = node.argumentList.map(\.expression)
  7. let printArgs = LabeledExprListSyntax {
  8. for expression in argExpressions {
  9. LabeledExprSyntax(
  10. expression: StringLiteralExprSyntax(content: expression.trimmedDescription + ":")
  11. )
  12. LabeledExprSyntax(expression: expression)
  13. }
  14. }
  15. return "print(\(printArgs))"
  16. }
  17. /*
  18. // an alternative implementation that expands to a closure that is invoked immediately,
  19. // containing a print call for each expression, so that they are printed on separate lines
  20. public static func expansion(
  21. of node: some FreestandingMacroExpansionSyntax,
  22. in context: some MacroExpansionContext
  23. ) throws -> ExprSyntax {
  24. let argExpressions = node.argumentList.map(\.expression)
  25. let block = CodeBlockItemListSyntax {
  26. for expression in argExpressions {
  27. "print(\(literal: expression.trimmedDescription + ":"), \(expression))"
  28. }
  29. }
  30. return """
  31. {
  32. \(block)
  33. }()
  34. """
  35. }
  36. */
  37. }

字符串
将其添加到providingMacros列表中,并像这样声明:

  1. @freestanding(expression)
  2. public macro printWithNames(_ args: Any...) =
  3. #externalMacro(module: "...", type: "PrintWithVariableName")


使用方法:

  1. #printWithNames(x, y)
  2. // expands to:
  3. print("x:", x, "y:", y)

展开查看全部

相关问题