迅速。使用' self'在初始化所有存储属性之前的方法调用中

时间:2016-08-19 12:47:36

标签: ios swift

我有一个班级

class ChartView: UIView
{
  class: DotView {
    let circleView1: UIView
    let circleView2: UIView

    init (view: UIView)
    {
      self.view = view
      self.circleView1 = self.buildCircle(some rect here)
      self.circleView2 = self.buildCircle(some rect here)

    func buildCircle(rect: CGRect) -> UIView
    {
       let dotView = UIView(frame: rect)
       dotView.backgroundColor = UIColor.whiteColor()
       dotView.layer.cornerRadius = dotView.bounds.width / 2
       self.view.addSubview(dotView)
       return dotView
    }
  }
}

但是我收到了这个错误: 使用' self'在方法调用' buildCircle'在所有存储的属性初始化之前

所以我只想在某个方法中创建对象,然后将其分配给存储的属性。我该如何修复我的代码?

3 个答案:

答案 0 :(得分:12)

在初始化所有非可选实例变量之前,您无法在self上调用方法。 有几种方法可以解决这个问题。

  1. 将属性更改为选项或隐式解包选项 (不推荐)
  2. buildCircle()方法设为静态或仅为a 在文件中运行,并为所有圈子调用addSubview() 在所有属性初始化并且您调用之后 super.init()
  3. 等。你必须避免在自己之前打电话给自己 班级被初始化了。

答案 1 :(得分:3)

为了解决这个问题,可以使用这些方法:

class MyClass: NSObject {
    var prop: String = ""

    override init() {
        super.init()
        self.setupMyProperty()
    }

    func setupMyProperty() {
        prop = "testValue"
    }
}


class MyClass1: NSObject {
    var prop: String = ""

    override init() {
        prop = MyClass1.setupMyProperty()
        super.init()
    }

    class func setupMyProperty() -> String{
        return "testValue"
    }
}

答案 2 :(得分:0)

您可以在函数willMoveToSuperview中创建circleView。 在此生命周期功能中,您确保正确分配ChartView,因此:

override func willMoveToSuperview(newSuperview: UIView?) {
      self.circleView1 = self.buildCircle(some rect here)
      self.circleView2 = self.buildCircle(some rect here)
}