2015-01-12 62 views
2

我在Swift中玩弄了一些自省,看起來好像如果你想獲得可打印版本中的對象的類,這些是最好的選擇。 (在beta 6.0中引入)。`_stdlib_getTypeName()`&`_stdlib_getDemangledTypeName()`聲明在哪裏? - 斯威夫特

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

我希望能找到其他方法內省,但不幸的是,命令一下方法把我給急的頭,他們還沒有宣佈在那裏。

我的其他選項是鍵入_stdlib並等待自動完成或控制空間來查看我的選項。不幸的是,這些方法都沒有自動完成。

是否有文件聲明這些和其他stdlib函數,或者是否存在這些方法的任何文檔?

+0

還原函數已經由馬特·加拉格爾在斯威夫特改寫。參見:https://github.com/mattgallagher/CwlDemangle/blob/master/CwlDemangle/CwlDengngle.swift –

回答

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 

我還沒有找到任何文件但是很多這些函數名稱都是相當具有解釋性的,通過試用它們總是可以發現很多!

3

所有的答案都很好,但是我們不能使用第二步的結果。我們甚至不知道這個功能是否可用或正確...

我一直被困在這些結果約1天。

最後我轉儲全部funcitons & 符號STDLIB從libswiftcore.dylib,我發現這個..

命令:

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" 

最後,我們可以揭露迅速更多的未公開的函數,我們從來沒有見過的,我們可以嘗試另外一個,我們從來沒有聽說過這樣的:

(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