在swift

时间:2017-08-18 14:18:35

标签: swift initialization

我试图在Swift中使用参数初始化一个类。我希望能够将数组传递给类。类似于let test = MyTestClass(data)

代码:

init(data: [CGFloat]){
    super.init(nibName: "Test", bundle: nil)
    self.data = data
}

required init?(coder decoder: NSCoder) {

    super.init(nibName: "Test", bundle: nil)
}

错误:

enter image description here

2 个答案:

答案 0 :(得分:4)

您可以在data中调用super 之前初始化init(coder 并在{{1}中调用相应的super方法来解决错误}}

init(coder

或者将let data : [CGFloat] init(data: [CGFloat]){ self.data = data super.init(nibName: "Test", bundle: nil) } required init?(coder decoder: NSCoder) { self.data = [CGFloat]() super.init(coder: decoder) } 声明为

data

然后你可以写

var data = [CGFloat]()

无论如何,您必须在init(data: [CGFloat]){ self.data = data super.init(nibName: "Test", bundle: nil) } required init?(coder decoder: NSCoder) { super.init(coder: decoder) } 中致电super.init(coder: decoder)

答案 1 :(得分:3)

Swift要求在初始化程序完成时设置所有参数。它还要求在调用另一个函数之前设置这些参数,这就是之后调用超级初始化器的原因,而不是Objective-C所要求的第一行。

在常规初始化程序中,您将data的值设置为传入的数组。但是你没有为init(coder:)方法这样做。

有两种方法可以解决这个问题:

一种方法是在调用init(coder:)初始化程序时抛出一个断言。

required init?(coder decoder: NSCoder) {
    fatalError("Not meant to be initialised this way")
}

另一种是分配"空"值:

required init?(coder decoder: NSCoder) {
    data = [CGFloat]() // just set an empty array
    super.init(nibName: "Test", bundle: nil)
}

您选择的方法取决于您希望如何使用域中的代码。我主要选择第一个选项,因为调用一个不打算使用的初始化程序是一个开发人员错误,并且最好只为这些类型的错误崩溃。