如何在协议扩展的实例方法中访问协议的静态属性?
当然可以访问!你之前的写法问题出在对Swift元类型的使用方式上,正确的做法是用type(of: self)获取当前实例的实际类型,再访问它的typeName静态属性。
修正后的代码
protocol X { static var typeName: String { get } } extension X { func getTypeName() -> String { // 通过type(of: self)拿到实例的实际类型,再访问静态属性 return type(of: self).typeName } }
为什么self.Type行不通?
在Swift里,self.Type表示的是「当前类型的元类型」这个类型本身,而不是具体的元类型实例。打个比方,它更像一个“类型的模板”,而不是你能直接调用属性的具体对象。
而type(of: self)会返回当前实例所属的具体类型的元类型对象,有了这个对象,我们就能正常访问该类型的静态属性typeName了。
实际使用示例
为了更直观,我们可以写一个遵守协议的类来测试:
class UserModel: X { static var typeName: String { return "UserModel" } } let user = UserModel() print(user.getTypeName()) // 输出 "UserModel"
内容的提问来源于stack exchange,提问作者bigblind
相关产品推荐
相关产品推荐

