我想知道是否可以从该协议中找到符合给定协议的类型的名称。我在考虑协议扩展,以避免在符合该协议的每种类型中重复。我尝试过:
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
。
有什么办法可以做到这一点?
答案 0 :(得分:2)
自然地,它正在打印T
,这正是您使用String(describing: T.self)
所要求的。 T
始终是协议本身。
在协议扩展名Self
(大写字母“ S”)中,您是指代一致性类型的方式。
所以扩展名应该是:
extension T {
var typeName: String {
return String(describing: Self.self)
}
}
此外,内置的type(of:)
函数已经为您提供了任何对象的动态类型,因此尚不清楚您是否真的需要自己复制此功能。