Swift:打印存储在变量中的函数名称

5
下面是一个例子:
let plus: (Int, Int) -> Int = (+)
print(plus)
debugPrint(plus)

print(UIView.removeFromSuperview)
debugPrint(UIView.removeFromSuperview)

print(UnsafePointer<Int>.distance(to:))
debugPrint(UnsafePointer<Int>.distance(to:))

打印无用输出:

(函数)
(函数)
(函数)
(函数)
(函数)
(函数)

有没有办法在Swift中获取函数的名称?我的意思是,不是当前正在运行的函数的名称(#function)。但是存储在变量或类函数中的函数的名称等。每种语言,尤其是那些自称为函数式语言的,都应该有这样的能力,对吧?


1
尝试 print(functionName.dynamicType) - koen
3
我不知道有哪一种函数式语言可以让你打印闭包的名称,哈哈。 - Alexander
1
@kelin JS、C# 不是函数式的。Swift 也不是函数式的。 - Cristik
@kelin,你介意解释一下第一行的语法吗?我不明白你如何创建一个没有花括号的匿名函数。(+) 是否等同于 {$0 + $1}?如果是这样,那么其逻辑是什么呢? - Kal
1
@Kal,这不是匿名函数。我只是将运算符分配给了一个变量。()需要帮助编译器理解它。您也可以像这样分配任何函数。 - kelin
显示剩余4条评论
1个回答

4

Swift是一种静态分派的编程语言。这导致Swift在需要调用函数时尽可能使用内存地址。副作用是无法捕获被调用函数的名称,因为在大多数情况下它将是一个简单的内存地址。

#function之所以有效,是因为该构造在编译时由调用方函数替换(它不是运行时构造)。

如果您有可用的调试符号,可以从二进制地址重构函数名称,但这将需要从应用程序内部访问dSYM基础设施,这是不太可能的,因为随着调试符号一起发布您的应用程序将邀请黑客对您的应用程序进行反向工程。

动态分派语言(如Objective-C)保留对被调用函数(选择器)的引用,但仅当被调用函数是方法(即成员函数)时。其他语言(如Ruby、JavaScript)是解释性语言,这使得函数名称始终可用。


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