在super.init调用之前,'self'在super.init调用和属性未初始化之前使用

时间:2016-06-06 22:12:42

标签: ios swift uiview

我正在尝试在我的自定义UIView中初始化一个Int数组:

var graphPoints:[Int]

required init?(coder aDecoder: NSCoder) {
    RestApiManager.sharedInstance.requestData() { (json: JSON) in
        for item in json[].array! {
            let n=item["n"].intValue
            print(n)
            if(n>=0) {
                self.graphPoints.append(n)
            }
        }
    }
    super.init(coder: aDecoder)
}

但是在这一行中RestApiManager.sharedInstance.requestData() {我发现了这个错误:在super.init调用之前使用了'self'

在这一行super.init(coder: aDecoder)错误:属性self.graphPoint未在super.init调用中初始化

3 个答案:

答案 0 :(得分:1)

Swift要求在调用super.init()之前初始化所有参数。有几种方法可以实现这一目标。

使用如下所示的空初始化程序声明graphPoints:

var graphPoints:[Int] = []   or var graphPoints = [Int]()

您还可以将graphPoints更改为Optional,如下所示:

var graphPoints:[Int]?

您也可以单独保留声明,并在调用super.init()之前将其初始化为空数组

您还需要在您的super.init电话下方移动您的RestAPI电话。

希望这有帮助。

答案 1 :(得分:1)

这里有一些单独的问题

第一个相关的两个问题是你必须在引用self之前调用super.init方法。只需将此行移至init方法的开头即可。

不幸的是,因为您正在执行异步请求,这仍然会导致您在注释中提到的问题。

另外,注意init?(coder aDecoder: NSCoder)不适用于此用途。另一个问题是,如果您要从API请求数据,则应创建模型对象。与直接创建UIView相反,然后当您希望将其显示给用户时,请从该模型创建UIView

class GraphPointsModel {
  var graphPoints:[Int]

  init(graphPoints: [Int]) {
    self.graphPoints = graphPoints
  }

  class func retreiveGraphPoints(handler: (GraphPointsModel -> ())) {
    RestApiManager.sharedInstance.requestData() { (json: JSON) in
      //Error checking...

      //Create instance of GraphPointsModel
      let instance = GraphPointsModel(...)  

      //Call handler to do with as you wish with result
      handler(instance)
    }
  }

}

答案 2 :(得分:0)

也许你必须这样做:

super.init(coder: aDecoder)

在你的requestData调用之前把它放。