Swift 4:type(of:self).description()与String不同(描述:type(of:self))

时间:2017-12-14 12:53:27

标签: swift oop dynamic-typing

我需要在超类中实现的方法中确定对象的动态类型。超类称为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实例。初始化程序以下列方式之一创建实例的字符串表示形式,具体取决于其协议一致性:

  • 如果实例符合TextOutputStreamable协议,则通过在空字符串s上调用instance.write(to:s)来获得结果。
  • 如果实例符合CustomStringConvertible协议,则结果为instance.description。
  • 如果实例符合CustomDebugStringConvertible协议,则结果为instance.debugDescription。
  • Swift标准库自动提供未指定的结果。

但是type(of:self)甚至没有description属性。它只有一个description()方法。这是一些由编译器处理的特殊情况吗?

1 个答案:

答案 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   默认资格。 debugPrintString(reflecting:)仍然可以   用来获得完全合格的名字。