【问题标题】:Swift - dynamicType in initializer of Subclass returns BaseClass insteadSwift - Subclass 的初始化程序中的 dynamicType 改为返回 BaseClass
【发布时间】:2015-02-17 02:21:15
【问题描述】:

我正在尝试创建一个抽象类,它可以从 CloudKit 获取记录并根据调用 fetch 方法的子类返回适当的实例。

问题是基类的类方法没有返回子类的实例。 在 Playground 中运行以下代码:

class Base {
  class var value: String { return "Base" }
  class func doSomething() -> Self { // In Obj-C this would return instanceType
    println("doSomething() = \(self.value)")
    let object = self.init()
    return object
  }

  init() {
    println("init() = \(self.dynamicType.value)")
  }
}

class Sub: Base {
  override class var value: String { return "Sub" }

  override init() {
    super.init()
    println("Value = \(self.dynamicType.value)")
  }
}

println("Base")
let base = Base.doSomething() // type = Base

println()
println("Sub")
let sub = Sub.doSomething() // type = Base !!

由于某种原因,在子类上调用 doSomething() 时,初始化程序会打印基类属性的值(“Base”而不是“Sub”):

基础 doSomething() = 基础
init() = 基础

子 doSomething() = 子
init() = 基础

【问题讨论】:

    标签: ios swift inheritance


    【解决方案1】:

    当您执行以下操作时,您应该得到正确的字符串值:

    NSStringFromClass(self.dynamicType)
    

    【讨论】:

      猜你喜欢
      • 2016-11-02
      • 2016-11-27
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多