gpt4 book ai didi

ios - 如何动态地分解 Swift 类名?

转载 作者:IT王子 更新时间:2023-10-29 05:17:42 25 4
gpt4 key购买 nike

我知道 swift-demangle 命令行实用程序。我正在寻找能让我从 Swift 本身做到这一点的东西。

从 Swift REPL 运行 :target modules dump symtab 后看到这个我很兴奋,但我不知道如何调用 swift_demangleSimpleClass

module dump

似乎有一个 @asmname 命令允许调用私有(private) Swift 函数,但我无法让它工作。

我可能最终会为此编写一个基于正则表达式的解析器,但在 Swift 框架本身中调用某些东西似乎更安全一些。

最佳答案

swift 5

您可以使用 Swift 的 swift_demangle 函数来分解名称,但它默认不导出,因此您需要先导入:

import Darwin

typealias Swift_Demangle = @convention(c) (_ mangledName: UnsafePointer<UInt8>?,
_ mangledNameLength: Int,
_ outputBuffer: UnsafeMutablePointer<UInt8>?,
_ outputBufferSize: UnsafeMutablePointer<Int>?,
_ flags: UInt32) -> UnsafeMutablePointer<Int8>?

func swift_demangle(_ mangled: String) -> String? {
let RTLD_DEFAULT = dlopen(nil, RTLD_NOW)
if let sym = dlsym(RTLD_DEFAULT, "swift_demangle") {
let f = unsafeBitCast(sym, to: Swift_Demangle.self)
if let cString = f(mangled, mangled.count, nil, nil, 0) {
defer { cString.deallocate() }
return String(cString: cString)
}
}
return nil
}

// How to use
if let s = swift_demangle("$s20MyPlayground_Sources4TestC4testSSyF") {
print(s) // MyPlayground_Sources.Test.test() -> Swift.String
}

关于ios - 如何动态地分解 Swift 类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24321773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com