Swift Objective-C运行时类的命名

我注意到Swift类在objective-c运行时被重命名。 所以,如果我有一个名为ViewController swift类,并且我执行object_getClass(self)时,我的应用程序的名称是TestRuntime ,我自己ViewController ,我会得到这个: _TtC11TestRuntime14ViewController 。 我注意到这种模式或格式: _TtC$$AppName$$ClassName$是一个随机数。 我不知道这些数字来自哪里。 如果有人能够阐明swift如何在运行时命名它的类,这真的会帮助我。

他们不是随机的。 它们是以下值的长度。 这与常见的C ++名称修改类似,并且支持可能具有相当任意字符的标识符,而不需要一些新的分隔符。 这也可以使他们更容易parsing,尤其是在C.

在这个特殊情况下,它是_TtC然后是“十一个字符模块名称”,然后是模块名称,然后是“十四个字符类名称”和类名称。 我假设C是类。 不知道Tt (也许“types”)。

描述在以下三节中构build

  1. 描述以_Tt开始,代表目标(包/应用程序名称)
  2. 之后,您将会看到一个或多个字母,如CPF,代表类别,协议或function。 这些按照嵌套顺序是相反的
  3. 然后你会得到一系列的数字加上一个名字,其中的数字是名字的长度。 其中的每一个都是针对目标,类,协议或者function,如描述的开始所指定的。

函数在这里是一个特例。 说明也将有一些关于function签名的信息。

例如,你可以有一个_TtCFCC5MyApp7MyClass10MySubClass6myFuncFS0_FT_T_L_11MySubSubClass

这将是以下代码中对MySubSubClass的描述:

 class MyClass { class MySubClass { func myFunc() { class MySubSubClass { } } } } 

在这里,您可以find一些示例代码 ,将该说明parsing为易于使用的属性和数组。

更新:Demangle现在转换为swift。 你可以在这里find它: https : //github.com/mattgallagher/CwlDemangle/blob/master/CwlDemangle/CwlDengngle.swift