声明计算变量后,编译器启动抱怨类没有初始化器

时间:2017-09-28 08:34:09

标签: ios swift swift3

我创建了一个类继承UITableViewCell

class MyCell: UITableViewCell {
  override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

没有编译器错误。然后,我宣布了一个计算变量:

class MyCell: UITableViewCell {
   var student: Student{
       willSet {...}
   }
   ...
}

现在,编译器开始抱怨Class 'MyCell' has no initializers。然后,我定义了一个空的初始值:

class MyCell: UITableViewCell {
       init(){}

       var student: Student{
           willSet {...}
       }
       ...
    }

错误仍然存​​在。为什么在声明计算变量之后,编译器开始抱怨错误&如何摆脱这个错误?

3 个答案:

答案 0 :(得分:1)

在{1}中设置(非可选)数据模型项的表视图单元格中的推荐解决方案是隐式展开的可选项。

无需覆盖任何初始值设定项。

cellForRow...

注意:

class MyCell: UITableViewCell { var student: Student! { willSet {...} } } 是计算属性。属性观察者只能在存储的属性中使用。

答案 1 :(得分:0)

尝试让您的学生成为可选的变种

var student: Student? {
       willSet {...}
}

答案 2 :(得分:0)

你应该试试这些:

选项1:

var student: Student! {
      willSet {...}
}

选项2:

var student: Student? {
      willSet {...}
}

因为我们必须初始化一个变量,否则编译器会给出错误。在选项1 中,我们将此变量声明为隐式展开的可选。这意味着它的初始值为零,但它的价值将来不会为零。在选项2 中,我们已将此变量声明为可选,这意味着它最初为零,并且将来可能没有值。或者您可以在此处初始化变量。

选项3:

var student: Student = Student() {
      willSet {...}
}

但是在这里你使用的是willSet{},这意味着你得到的是动态值,而不是编译时间。所以我认为第一个选项将删除您的错误。您应该尝试最适合您的最佳选择。

<强>结论
我们必须初始化一个变量。