如何初始化将在超类的初始化程序中使用的子类初始化程序中的变量?

时间:2016-02-03 06:55:41

标签: swift

在下面的代码中,我的目的是在基类中声明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()。在某种程度上,这对我来说是一个悖论。

我也理解我可以改变设计以使错误消失,但我想知道是否可以通过一些调整实现我的初衷?我可能在这里想念一些东西。

2 个答案:

答案 0 :(得分:4)

您当前的代码甚至无法编译,是吗?它应该抱怨在初始化之前尝试使用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)
  }
}

答案 1 :(得分:0)

我不知道你想要什么,以下代码就是好的

class Base {
    var repeatNum: Int?

    init() {

    }

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

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

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

class Base {
    var _repeatNum:Int?;
    var repeatNum: Int?{
        get{
            return _repeatNum
        }
        set{
            _repeatNum =  newValue
            printyourneed()
        }
    }

    init() {

    }

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

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

    }
}

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

    }
}