【问题标题】:Swift: Print name of a function stored in a variableSwift:打印存储在变量中的函数的名称
【发布时间】:2018-08-30 12:33:34
【问题描述】:

下面的例子:

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)。但是存储在变量中的函数名称,或者类函数等。每种语言,尤其是伪装成函数的语言,都应该有这样的能力,对吧?

【问题讨论】:

  • 试试print(functionName.dynamicType)
  • 我不知道有一种函数式语言可以让您打印闭包的名称,哈哈
  • @Alexander,JS,C#。
  • @kelin JS,C# 不起作用。 Swift 不起作用
  • @Kal,它不是匿名函数。我刚刚将一个运算符分配给一个变量。 () 需要帮助编译器理解它。您也可以分配任何类似的功能。

标签: swift function


【解决方案1】:

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

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

如果您有可用的调试符号,您可以从二进制地址重构函数名称,但这需要从您的应用程序中访问 dSYM 基础架构,您不太可能想要这样做,因为您已经发货了应用程序连同调试符号是邀请黑客对您的应用程序进行逆向工程的邀请。

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

【讨论】:

    【解决方案2】:

    从 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

    【讨论】:

    • 很好,也很正确。但我需要打印一个函数的名称。
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多