如何在 Swift 中获取泛型参数的运行时类型的完全限定名称



例如,

func inject<P, D>(params: P, create: P -> D) {
    let type = String(D)
    // etc.
}

上面的技术似乎适用于任何 Swift 类型(包括协议(,但不幸的是type不包含模块名称,只包含类型本身。换句话说,如果DWatusi并且WatusiZing模块中,我想要Zing.Watusi,而不仅仅是Watusi

有人知道如何为作为通用参数传递的任何 Swift 类型获取整个玉米卷饼吗?

最终,这样做的目的是将完全限定类型用作此依赖项解析程序实现中的键。

注意:安东·布朗尼科夫在下面提出了一个很好的建议。这是我所知道的,但我应该澄清一下,我需要一个公共 API,否则应用程序将被拒绝,我的客户会不满意。

我认为你可以通过以下方式更接近你想要的:

func inject<P, D>(params: P, create: P -> D) {
    let type = _stdlib_getDemangledTypeName(D)
    // etc.
}

上面将产生几乎你想要的字符串,除了最后的"不必要的".Type

答案是 String(reflecting: D.self) ,其中 D 是一种类型。

最新更新