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

时间:2019-01-11 17:22:07

标签: swift swift-protocols

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

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

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

1 个答案:

答案 0 :(得分:2)

自然地,它正在打印T,这正是您使用String(describing: T.self)所要求的。 T始终是协议本身。

在协议扩展名Self(大写字母“ S”)中,您是指代一致性类型的方式。

所以扩展名应该是:

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

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