在下面的代码中,我的意图是在基类中声明repeatNum,因为它用于基类(在init和其他函数内部)。每个子类都应该设置repeatNum,因为只有子类知道自己的值。

class Base {
    var repeatNum: Int

    init() {
       for var i=0; i<repeatNum; ++i {
           print("*")
       }
    }
}

class SubClass1 : Base {
    override init() {
        repeatNum = 10
        super.init()
    }
}

class SubClass2 : Base {
    override init() {
        repeatNum = 5
        super.init()
    }
}

当然,它会提示一些错误:
对于基类:
“self.repeatNum”未初始化
从初始值设定项返回,而不初始化所有存储的属性。
对于子类:
在super.init初始化self之前,在属性访问repeatNum中使用“self”
我知道在子类中设置super.init()之前,我可以简单地调用repeatNum,但在实际情况中,我确实需要在基类的repeatNum中使用init()。不知怎的,这对我来说成了一个悖论。
我也知道我可以改变设计,使错误消失,但我想知道是否有可能实现我的初衷与一些微调?我可能错过了一些东西。

最佳答案

你现在的代码甚至不能编译,是吗?它应该抱怨在初始化之前试图使用repeatNum。。。
也许这样的事情对你来说是个选择?

class Base {
  var repeatNum: Int

  init(repeatNum: Int) {
    self.repeatNum = repeatNum

    for _ in 0..<repeatNum {
      print("*")
    }
  }
}

class SubClass1 : Base {
  init() {
    super.init(repeatNum: 10)
  }
}

class SubClass2 : Base {
  init() {
    super.init(repeatNum: 5)
  }
}

关于swift - 如何在子类的初始化器中初始化将在父类(super class)的初始化器中使用的变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35170404/

10-14 14:43
查看更多