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

时间:2018-08-29 18:19:12

标签: swift function

以下示例:

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中获取函数的名称吗?,不是当前正在运行的函数的名称(#funciton)。但是存储在变量或类函数等中的函数的名称。每种语言,尤其是假装是函数性的语言,都应该具有这种能力,对吗?

2 个答案:

答案 0 :(得分:3)

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

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

如果有可用的调试符号,则可以从二进制地址重建函数名称,但是这将需要从应用程序内部访问dSYM基础结构,这不太可能因为您需要运送而已应用程序以及调试符号,这是黑客邀请您对应用程序进行逆向工程的原因。

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

答案 1 :(得分:1)

从Swift 3开始.dynmaicType已过时,现在您将使用type(of: )

let plus: (Int, Int) -> Int = (+)
print(type(of: plus))
debugPrint(type(of: plus))
print(type(of: UIView.removeFromSuperview))
debugPrint(type(of: UIView.removeFromSuperview))

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

产生以下输出。

  

(Int,Int)-> Int

     

(Swift.Int,Swift.Int)-> Swift.Int

     

(UIView)->()->()

     

(__ ObjC.UIView)->()->()

     

(UnsafePointer)->(UnsafePointer)-> Int

     

(Swift.UnsafePointer)->(Swift.UnsafePointer)-> Swift.Int