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

Get "path" of nested types as string in Swift

提问人:Mischa 提问时间:7/3/2018 最后编辑:Mischa 更新时间:7/10/2018 访问量:632

问:

问题

我正在寻找一种通用方法来获取 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:)

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

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

swift 字符串 套嵌 类型

评论

0赞 zombie 7/3/2018
class_getSuperclass应该会有所帮助
4赞 Martin R 7/3/2018
根据 github.com/apple/swift/blob/master/CHANGELOG.md 的说法:“String(reflecting:) 仍然可以用来获取完全限定的名称”——除非我弄错了,否则第一个组件始终是模块名称。
1赞 Alexander 7/3/2018
__lldb_expr_22是模块名称。我猜你是在操场上跑这个?
0赞 Mischa 7/4/2018
正确。感谢您的输入!

答: 暂无答案