我正在尝试在我的自定义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调用中初始化
答案 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调用之前把它放。