在Swift中将嵌套类型的“路径”获取为字符串

时间:2018-07-03 14:38:22

标签: swift string types nested nested-types

问题

我正在寻找一种通用方法来获取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:)让我有些担心,因为

  • 没有人能保证在某些情况下不会返回其他前缀或根本没有前缀
  • 该函数的描述指出它仅用于调试目的。

那么有没有办法以安全的方式获得嵌套类型的(全)名称?

0 个答案:

没有答案