`_stdlib_getTypeName()`& `_stdlib_getDemangledTypeName()`声明? - 斯威夫特

时间:2015-01-12 22:49:10

标签: swift

我在Swift中玩弄了一些内省,看起来如果你想在一个可打印的版本中得到一个对象的类,这些是最好的选择。 (在beta 6.0中引入)。

_stdlib_getTypeName(someClass)
_stdlib_getDemangledTypeName(someClass) // A slightly cleaner version

我希望找到其他内省方法,但不幸的是,单击这些方法的命令将我带到Swift标题,并且他们没有在那里声明。

我的另一个选择是输入_stdlib并等待自动完成或控制空间以查看我的选项。不幸的是,这些方法都没有自动完成。

是否存在声明这些和其他stdlib函数的文件,或者是否存在这些方法的文档?

2 个答案:

答案 0 :(得分:8)

我通过领域here的博客文章发现了我的问题的答案 - 尤其是JP Simard的帖子。

查看其他方法的最佳方法是转到您的终端并输入:

cd `xcode-select -p`/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx

然后输入以下内容:

nm -a libswiftCore.dylib | grep "T _swift_stdlib"

这将为您提供所有可用功能的读数,如下所示:

00000000001a43c0 T _swift_stdlib_NSObject_isEqual
00000000001a4490 T _swift_stdlib_NSStringHasPrefixNFD
00000000001a44f0 T _swift_stdlib_NSStringHasSuffixNFD
00000000001a4450 T _swift_stdlib_NSStringNFDHashValue
00000000001a2650 T _swift_stdlib_atomicCompareExchangeStrongPtr
00000000001a2670 T _swift_stdlib_atomicCompareExchangeStrongUInt32
00000000001a2690 T _swift_stdlib_atomicCompareExchangeStrongUInt64
00000000001a2700 T _swift_stdlib_atomicFetchAddUInt32
00000000001a2710 T _swift_stdlib_atomicFetchAddUInt64
00000000001a26f0 T _swift_stdlib_atomicLoadPtr
00000000001a26d0 T _swift_stdlib_atomicLoadUInt32
00000000001a26e0 T _swift_stdlib_atomicLoadUInt64
00000000001a26b0 T _swift_stdlib_atomicStoreUInt32
00000000001a26c0 T _swift_stdlib_atomicStoreUInt64
00000000001a4410 T _swift_stdlib_compareNSStringDeterministicUnicodeCollation
000000000017c560 T _swift_stdlib_conformsToProtocol
00000000001a5a80 T _swift_stdlib_demangleName
000000000017c8e0 T _swift_stdlib_dynamicCastToExistential1
000000000017c6f0 T _swift_stdlib_dynamicCastToExistential1Unconditional
00000000001a5910 T _swift_stdlib_getTypeName

我还没有找到任何文档,但很多这些函数名称都是相当明确的,人们总是可以通过尝试来发现它们!

答案 1 :(得分:3)

所有答案都很好,但是我们无法使用的第二步的结果。我们甚至不知道这个功能是否可用或正确...

我被困在这些结果中约1天。

最后我转储所有功能&来自libswiftcore.dylib的 stdlib 符号,我发现了这个..

命令:

nm  libswiftcore.dylib | grep "_stdlib_"

我们可以从结果中找到一行:

00000000000b2ca0 T __TFSs19_stdlib_getTypeNameU__FQ_SS

删除第一个下划线" _"然后我们得到这个:

_TFSs19_stdlib_getTypeNameU__FQ_SS

也许我们可以查看此website以了解 " _TFSs19_stdlib_getTypeNameU__FQ_SS" 的含义,

但我认为我们可以更快地获得正确的功能描述! 所以,我们在下面的xcode lldb窗口中解码如下:

(lldb) p _stdlib_demangleName("_TFSs19_stdlib_getTypeNameU__FQ_SS")
(String) $R0 = "Swift._stdlib_getTypeName <A>(A) -> Swift.String"

最后,我们可以在swift中暴露更多我们从未见过的未记录的函数,我们可以尝试另一个我们从未听说过的函数:

(lldb) p _stdlib_demangleName("_TFSs24_stdlib_atomicLoadARCRefFT6objectGVSs20UnsafeMutablePointerGSqPSs9AnyObject____GSqPS0___")
(String) $R1 = "Swift._stdlib_atomicLoadARCRef (object : Swift.UnsafeMutablePointer<Swift.Optional<Swift.AnyObject>>) -> Swift.Optional<Swift.AnyObject>"

全部清楚〜感谢上帝!!

分享给你,希望它可以帮助〜 :d