在Swift中获取函数名称

18
我想获取Swift中函数的名称。
我基本上需要像这样的东西
__FUNCTION__

但是来自不同的函数,例如:

func do () {
   code etc
}

func doStuff () {
   var funcName = do().name
}

以上内容将是完美的。

有什么想法吗?


请问您能解释一下使用情况吗?为什么您需要它呢? - Sulthan
一个使用案例是运行时生成和编译代码。在运行时能够获取函数名称可以实现更多的编译时检查。 - bjschoenfeld
3个回答

25

#function 可能是您想要的。

print(#function)

class Log {
    func info(_ info: String, funcName: String = #function) {}
}

5
在Swift 3中,正确的关键字是#function。您可以传递一个指向用于存储函数名称的String对象的指针。例如:
func myFunction(param1:Any, param2:Any, functionName: UnsafeMutablePointer<String>?) -> Any {
    if functionName != nil { 
        functionName.pointee = #function 
    }
    ...
}

使用方法:

var name:String 
// You can always pass nil if you are not interested in retrieving the 
// function name
let result = myFunction(1, 2, functionName: &name) 
print(name)

1

不是最干净的,但它可以工作。

func dost () -> (name: String,String) {
    return (__FUNCTION__,"")
}

func doStuff () {
    var funcName = dost().name
}

你可以只返回函数名而不是元组。

我得到了类似的东西 func dostuff(getName: Bool) -> String {if (getName) return __FUNCTION__ } 但我想知道是否有更好的选择。 - RyanCosans
3
注意:在Swift 3中,它已被替换为#function。 - Ramy Al Zuhouri
@RamyAlZuhouri 谢谢!如果您将评论写在答案下面,它可能会被采纳,问题也可能会被关闭。 - Reinhard Männer
好的,我详细阐述了一下,并将其作为答案。 - Ramy Al Zuhouri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接