关于dynamicType和编译时类型,Apple自己的Swift文档似乎是错误的

时间:2015-12-29 21:24:35

标签: swift dynamic types swift2 xcode7

参考:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html

我们有:

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文档试图展示的完全动态的运行时类型检查功能。

谁错,怎么解决?

2 个答案:

答案 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],