参考:
我们有:
class SomeBaseClass {
class func printClassName() {
print("SomeBaseClass")
}
}
class SomeSubClass: SomeBaseClass {
override class func printClassName() {
print("SomeSubClass")
}
}
let someInstance: SomeBaseClass = SomeSubClass()
// The compile-time type of someInstance is SomeBaseClass,
// and the runtime type of someInstance is SomeBaseClass
someInstance.dynamicType.printClassName()
// prints "SomeSubClass"
使用标识运算符(===和!==)来测试实例的运行时类型是否与其编译时类型相同。
if someInstance.dynamicType === someInstance.self {
print("The dynamic type of someInstance is SomeBaseCass")
}
else {
print("The dynamic type of someInstance isn't SomeBaseClass")
}
但someInstance.self
似乎是指对象,而不是对象的编译时类型,正如文档所声称的那样。实际上在Xcode 7.2中,即使我们将someInstance
初始化为SomeBaseClass
,测试也不会评估为真。
它并没有激发人们对文档有错字(SomeBaseCass)的信心。
我能找到使“真实”条款解雇的唯一方法就是突变:
if someInstance.dynamicType == SomeBaseClass.self { ... }
这很有趣,但是错过了有缺陷的Apple文档试图展示的完全动态的运行时类型检查功能。
谁错,怎么解决?
答案 0 :(得分:1)
这是一个错字 - 给你的荣誉。该部分是关于Metatype类型的,它们在整个部分使用type_name.self,除了那行。
除了那个dynamicType按照宣传的方式工作 - 这里没什么不对。
答案 1 :(得分:0)
我怀疑
let someInstance: SomeBaseClass = SomeSubClass()
// The compile-time type of someInstance is SomeBaseClass,
// and the runtime type of someInstance is SomeBaseClass
someInstance.dynamicType.printClassName()
// prints "SomeSubClass"
并且someInstance的运行时类型应该是[SomeSubClass],