如何在`inline`函数中使用`#function`符号?

时间:2017-04-07 09:17:19

标签: swift

我想使用函数名来解决一些问题,但#function似乎无法与@inline(__always)一起使用,这是我的代码:

@inline(__always) func log() {
  print(#function)
}
func a() { log() } // want 'a()', but got 'log()'
func b() { log() }
func c() { log() }
//...

任何人都可以解释一下吗?或者这只是一个愚蠢的想法。

1 个答案:

答案 0 :(得分:3)

如果您打算打印调用函数的名称 log(),然后你应该将它作为默认参数传递(对其进行评估) 在调用者的上下文中,如所示 在Swift博客的Building assert() in Swift, Part 2: __FILE__ and __LINE__中。

示例:

@inline(__always) func log(_ message: String, callingFunction: String = #function) {
    print("\(callingFunction): \(message)")
}

func a() { log("Hello world") }
func b() { log("Foo") }
func c() { log("Bar") }

a() // a(): Hello world
b() // b(): Foo
c() // c(): Bar

无论log函数是否内联,这都有效。 (内联不会改变程序的语义。特别是, 这并不意味着包含func log的源代码 func a()的源代码并编译为单个函数。)