我试图在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)
}
错误:
答案 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)
}
您选择的方法取决于您希望如何使用域中的代码。我主要选择第一个选项,因为调用一个不打算使用的初始化程序是一个开发人员错误,并且最好只为这些类型的错误崩溃。