我正在寻找一种通用方法来获取Swift中嵌套类型的全名,即当我按以下方式定义嵌套结构时:
struct A {
struct B {
struct C {
}
}
}
然后我创建一个C
的实例,然后我想有一个方法可以返回该实例类型的完整路径:
let c = A.B.C()
fullTypeName(c) // should return "A.B.C"
当我使用
String(describing: type(of: c))
它仅返回最后一个组成部分C
,即相对于其定义范围的类型名称。
当我使用
String(reflecting: type(of: c))
它实际上返回整个路径,但带有一些丑陋的前缀__lldb_expr_22.A.B.C
。
我由此创建了一个简单的自定义String
初始化程序:
extension String {
init<Subject>(describingNestedType: Subject) {
let string = String(reflecting: Subject.self)
let components = string.split(separator: ".")
let path = components.dropFirst().joined(separator: ".")
self = path
}
}
效果很好:
let c = A.B.C()
let cString = String(describingNestedType: c)
print(cString) // prints "A.B.C"
但是使用方法String(reflecting:)
让我有些担心,因为