[英]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
? 為什么AB
和AD
被跳過而不被使用? 請注意,這僅適用於字符串中的經常性項目,如果沒有經常性項目,我可以愉快地進行編碼。
在第一種情況下,替代指數分配如下:
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
第二種情況發生了類似的事情。 AB
是TEST.TEST
, AD
是TEST.TEST.Car
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.