在MacOS上使用SWIFT5.6,并为断断续续的规则提供以下Swift代码:
class Car //AB
{
class Foo //AD
{
func Foo() -> Void //AD
{
}
}
}Foo的错误名称是_$s4TEST3CarC3FooCADyyF (目标名称TEST),我不明白为什么给Foo索引代码AD,我希望分配AC:
AA AB AC
TEST.Car.Foo.Foo在另一个例子中:
class TEST //AA
{
class Car //AC
{
class Foo //AE
{
class Car //AC
{
func Foo() -> Void //AE
{
}
}
}
}
}错误的名称是_$s4TESTAAC3CarC3FooCACCAEyyF,同样,这些是我要分配的值:
AA AB AC
TEST.TEST.Car.Foo.Car.Foo为什么在第一个长形式编码Foo之后将AE分配给3Foo?为什么跳过AB和AD而不使用?请注意,这仅适用于字符串中的经常性项,如果没有重复项,我可以愉快地进行编码。
发布于 2022-04-26 21:59:57
在第一种情况下,替代指数分配如下:
AA TEST
AB Car
AC TEST.Car
AD Foo
AE TEST.Car.Foo您可以通过使用这个问题中的demangling代码来获得这些结果。方法的破损名称,只是没有F后缀-这是允许我们添加任何A替代我们的选择到末尾。(我还删除了yy以减少输出中的噪声)
print(swift_demangle("$s4TEST3CarC3FooCAdA")!)
print(swift_demangle("$s4TEST3CarC3FooCAdB")!)
print(swift_demangle("$s4TEST3CarC3FooCAdC")!)
print(swift_demangle("$s4TEST3CarC3FooCAdD")!)
print(swift_demangle("$s4TEST3CarC3FooCAdE")!)
/*
TEST.Car.FooFooTEST
TEST.Car.FooFooCar
TEST.Car.FooFooTEST.Car
TEST.Car.FooFooFoo
TEST.Car.FooFooTEST.Car.Foo
*/因此,当损坏的算法破坏Car时,它也会“记住”替代TEST.Car (因为它可能是一种名义类型),而不仅仅是Car本身。无论以后是否使用替换,都会发生这种情况,这可能是为了使查询更容易(?)
当您将代码更改为:
class Car
{
class Foo
{
func Foo() -> Car
{
fatalError("")
}
}
}现在,Foo的错误名称是$s6output3CarC3FooCAdCyF,它使用了AC。
作为一种心理模型,您可以将其看作是与破损名称中的字母C以及<number><identifier>部件相关联的替换索引,如下所示:
$s4TEST3CarC3FooCADyyF
^ ^ ^ ^ ^
| | | | |
AA ABAC ADAE在第二种情况下也会发生类似的情况。AB是TEST.TEST,AD是TEST.TEST.Car。
https://stackoverflow.com/questions/72014250
复制相似问题