我需要在超类中实现的方法中确定对象的动态类型。超类称为BaseClient,DisplayClient继承它。
我只需要类名,而不是包名。这就是我试过的:
print("1", String(describing: type(of: self))) // DisplayClient
print("2", type(of: self)) // DisplayClient
print("3", type(of: self).description()) // package.DisplayClient
print("4", "\(type(of: self))") // DisplayClient
为什么
type(of: self).description()
返回package.DisplayClient而其他人只返回类名?我想知道当我使用String时内部调用什么(描述:type(of:self))。我认为这完全符合我的要求(调用describe())。
在哪里可以找到有关如何在内部生成字符串的更多信息?
docs说:
使用此初始化程序将任何类型的实例转换为其首选表示形式的String实例。初始化程序以下列方式之一创建实例的字符串表示形式,具体取决于其协议一致性:
但是type(of:self)甚至没有description属性。它只有一个description()方法。这是一些由编译器处理的特殊情况吗?
答案 0 :(得分:3)
如果您的班级继承自NSObject
,那么type(of: self).description()
调用NSObject.description()
class method:
class func description() -> String
NSObject的这种方法的实现只是打印了类的名称。
并未记录是否包含模块名称。
如果你的班级没有从NSObject
继承,那么就没有
默认description()
方法。
另一方面,
print(String(describing: type(of: self))) // DisplayClient
print(type(of: self)) // DisplayClient
都打印非限定类型名称和
print(String(reflecting: type(of: self))) // package.DisplayClient
debugPrint(type(of: self) ) // package.DisplayClient
都打印完全限定的类型名称,比较 How to get a Swift type name as a string with its namespace (or framework name) 和Xcode 7 Release Notes:
现在打印类型名称和枚举案例并将其转换为String 默认资格。
debugPrint
或String(reflecting:)
仍然可以 用来获得完全合格的名字。