我可以从该协议中获取符合该协议的类型的名称吗?

Can I get the name of a type conforming to a protocol from that protocol?

我想知道是否可以从该协议中找到符合给定协议的类型的名称。我正在考虑协议扩展以避免在符合该协议的每种类型中重复。我试过这个:

protocol T {
    var type: String { get }
}

extension T {
    var type: String {
        return String(describing: T.self)
    }
}

struct S: T {}
let s = S()
print(s.type)

但这显示的是 T 而不是 S

有什么办法可以做到这一点吗?

自然是打印 T,这就是你用 String(describing: T.self) 要求的。 T 始终是协议本身。

在协议扩展 Self 中(大写 'S')是您引用符合类型的方式。

所以扩展名应该是:

extension T {
    var typeName: String {
        return String(describing: Self.self)
    }
}

另外,内置的 type(of:) 函数已经为您提供了任何对象的动态类型,因此不清楚您是否真的需要自己复制此功能。