如何将Swift类型名称作为带有名称空间(或框架名称)的字符串

时间:2015-10-31 14:37:09

标签: ios swift

有没有办法将Swift类型名称作为带有命名空间(或框架名称)的字符串?

例如,如果Foo.framework有一个名为Bar的类,我希望得到类似"Foo.Bar"的字符串。

以下内容只返回班级名称"Bar"

let barName1 = String(Bar.self)       // returns "Bar"
let barName2 = "\(Bar.self)"          // returns "Bar"
let barName3 = "\(Bar().dynamicType)" // returns "Bar"

我还希望将框架名称"Foo"作为命名空间。

2 个答案:

答案 0 :(得分:24)

使用String(reflecting:)

struct Bar { }

let barName = String(reflecting: Bar.self) 
print(barName) // <Module>.Bar

来自Xcode 7 Release Notes

  

现在打印类型名称和枚举案例并将其转换为String   默认资格。 debugPrintString(reflecting:)仍然可以   用来获得完全合格的名字。

答案 1 :(得分:1)

String(reflecting:)现在就可以使用,但是将来可能会改变。因此,如果您暂时只需要标准名称,就可以了。但是,如果您要长期使用该名称(跨越多个Swift版本),则不要使用它。

Swift社区正在试图就从类型中获取信息的更长期方法达成共识。

来自Joe Groff:

  

在4.2中,String(reflecting :)仍然显示本地类型的完全限定名称,但是本地类型上下文被匿名化并以不稳定的方式打印,因为无论我们支持哪种反射,将来添加时,偶然依赖动态代码中本地类型的存在或身份将是一个坏主意。

https://forums.swift.org/t/getting-the-more-fully-qualified-name-of-a-type/14375/9