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

时间:2016-02-15 22:13:39

标签: swift swift2

如,

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

上述技术似乎适用于任何 Swift类型(包括协议),但不幸的是type不包含模块名称,只包含类型本身。换句话说,如果D Watusi WatusiZing位于Zing.Watusi模块中,我需要Watusi,而不仅仅是{{1}}。

任何人都知道如何获取整个辣酱玉米饼馅,任何 Swift类型作为通用参数传递?

最终,这样做的目的是将完全限定类型用作此dependency resolver implementation中的键。

注:Anton Bronnikov在下面提出了一个很好的建议。这是我所知道的,但我应该澄清一下,我需要一个 public API,否则该应用将被拒绝,我的客户将不满意。

2 个答案:

答案 0 :(得分:1)

我认为你可以更接近你想要的东西:

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

上面几乎会产生你想要的字符串,除了&#34;不必要的&#34;最后.Type

答案 1 :(得分:0)

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