有没有办法将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"
作为命名空间。
答案 0 :(得分:24)
struct Bar { }
let barName = String(reflecting: Bar.self)
print(barName) // <Module>.Bar
现在打印类型名称和枚举案例并将其转换为String 默认资格。
debugPrint
或String(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