以下示例:
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
)。但是存储在变量或类函数等中的函数的名称。每种语言,尤其是假装是函数性的语言,都应该具有这种能力,对吗?
答案 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