Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift “\u stdlib\u getTypeName()”在哪里&`_stdlib_getDemangledTypeName()`已声明?--敏捷的_Swift - Fatal编程技术网

Swift “\u stdlib\u getTypeName()”在哪里&`_stdlib_getDemangledTypeName()`已声明?--敏捷的

Swift “\u stdlib\u getTypeName()”在哪里&`_stdlib_getDemangledTypeName()`已声明?--敏捷的,swift,Swift,我在玩弄Swift中的一些自省,如果您想在可打印版本中获得对象的类,这些是最好的选择。(在beta 6.0中引入) 我希望找到其他内省方法,但不幸的是,命令单击这些方法会将我带到Swift标题,而它们没有在那里声明 我的另一个选择是键入\u stdlib,然后等待自动完成或控制空间来查看我的选项。不幸的是,这些方法都无法自动完成 是否有一个文件可以声明这些和其他stdlib函数,或者在任何地方都有这些方法的文档?我通过realm的tips and tricks博客文章找到了我问题的答案,特别是J

我在玩弄Swift中的一些自省,如果您想在可打印版本中获得对象的类,这些是最好的选择。(在beta 6.0中引入)

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

我的另一个选择是键入
\u stdlib
,然后等待自动完成或控制空间来查看我的选项。不幸的是,这些方法都无法自动完成


是否有一个文件可以声明这些和其他stdlib函数,或者在任何地方都有这些方法的文档?

我通过realm的tips and tricks博客文章找到了我问题的答案,特别是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
(lldb) p _stdlib_demangleName("_TFSs24_stdlib_atomicLoadARCRefFT6objectGVSs20UnsafeMutablePointerGSqPSs9AnyObject____GSqPS0___")
(String) $R1 = "Swift._stdlib_atomicLoadARCRef (object : Swift.UnsafeMutablePointer<Swift.Optional<Swift.AnyObject>>) -> Swift.Optional<Swift.AnyObject>"

我还没有找到任何文档,但是这些函数名中有很多都是相当解释性的,人们可以通过尝试发现很多

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

我被困在这些结果中大约一天了

最后,我从libswiftcore.dylib中转储了stdlib的所有函数和符号,我发现了这个

命令:

nm  libswiftcore.dylib | grep "_stdlib_"
我们可以从结果中找到一行:

00000000000b2ca0 T __TFSs19_stdlib_getTypeNameU__FQ_SS
首先删除下划线“\u1”,然后我们得到:

_TFSs19_stdlib_getTypeNameU__FQ_SS
也许我们可以通过观察这一点来理解“\u TFSs19\u stdlib\u getTypeNameU\u FQ\u SS”的含义

但是我认为我们可以更快地得到正确的函数描述!! 因此,我们在xcode lldb窗口中的需求如下所示:

(lldb) p _stdlib_demangleName("_TFSs19_stdlib_getTypeNameU__FQ_SS")
(String) $R0 = "Swift._stdlib_getTypeName <A>(A) -> Swift.String"
(lldb)p_stdlib_demangleName(“TFSs19_stdlib_getTypeNameU_FQ_SS”)
(String)$R0=“Swift.\u stdlib\u getTypeName(A)->Swift.String”
最后,我们可以在swift中公开更多以前从未见过的未记录函数,我们可以尝试另一个从未听说过的函数:

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
(lldb) p _stdlib_demangleName("_TFSs24_stdlib_atomicLoadARCRefFT6objectGVSs20UnsafeMutablePointerGSqPSs9AnyObject____GSqPS0___")
(String) $R1 = "Swift._stdlib_atomicLoadARCRef (object : Swift.UnsafeMutablePointer<Swift.Optional<Swift.AnyObject>>) -> Swift.Optional<Swift.AnyObject>"
(lldb)p_stdlib_demangleName(“_TFSs24_stdlib_atomicloadarcrefft6objectgvss20unsafemeutablepointergsqpss9anyobject_uuuuuuuugsqps0_uuuuuuuuu”)
(字符串)$R1=“Swift.\u stdlib\u atomicLoadARCRef(对象:Swift.UnsafeMutablePointer)->Swift.Optional”
一切正常~感谢上帝

把这个分享给你,希望能对你有所帮助~
:D

Demangle已由Matt Gallagher在Swift中改写。见: