簡體   English   中英

Apple Swift 重復上下文的修改規則

[英]Apple Swift mangling rules for recurring context

在帶有 Swift 5.6 的 MacOS 上,並使用以下 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在第一個長格式編碼3Foo之后被分配給AE 為什么ABAD被跳過而不被使用? 請注意,這僅適用於字符串中的經常性項目,如果沒有經常性項目,我可以愉快地進行編碼。

在第一種情況下,替代指數分配如下:

AA TEST
AB Car
AC TEST.Car
AD Foo
AE TEST.Car.Foo

您可以使用此問題中的分解代碼獲得這些結果。 Demangle 方法的損壞名稱,只是沒有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

作為一個心理 model,您可以將其視為與錯位名稱中的字母C以及<number><identifier>部分相關聯的替代索引,如下所示:

$s4TEST3CarC3FooCADyyF
   ^     ^ ^  ^ ^
   |     | |  | |
  AA     ABAC ADAE

第二種情況發生了類似的事情。 ABTEST.TESTADTEST.TEST.Car

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM