从初始化程序返回而不初始化所有存储的属性

我有这样一个简单的类。

public class User { let id: Int let firstName: String let lastName: String let email: String? init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } 

这在以前的Swift版本中编译得很好。 在Swift 1.2中,我得到了下面的编译错误。

从初始化程序返回而不初始化所有存储的属性

为什么是这样的,我该如何解决呢?

如果一个属性是不变的,用let创build,你必须在initinit方法中初始化它,即使它是一个Optional 。 如果你想能够select设置电子邮件,你应该改变let var 。 换句话说,如果你不是在init方法或类体中初始化一个variables,那么这个variables必须是var和一个Optional

文档中的相关声明:

只要在初始化完成的时间将其设置为一个确定的值,就可以在初始化的任何时间点将一个值赋给一个常量属性。 一旦一个常量属性被分配一个值,它就不能被进一步修改。

对于类实例,常量属性只能在引入它的类的初始化期间修改。 它不能被子类修改。

您需要明确设置电子邮件的值,因为它是一个常量。

 public class User { let id: Int let firstName: String let lastName: String let email: String? init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName self.email = nil // <-------------- } } 

或者像其他人提到的那样,您可以将电子邮件更改为variables。

经验法则是:

  • 如果你让,你需要初始化它(即使它是可选的)。 例如: let email: String
  • 如果你有一个非可选的var,你需要初始化。 例如var email: String
  • 如果你有一个可选的var,你不需要初始化它。 例如var email: String?

将电子邮件从“let”更改为“var”,如下所示。

 public class User { let id: Int let firstName: String let lastName: String var email: String? init(id: Int, firstName: String, lastName: String) { self.id = id self.firstName = firstName self.lastName = lastName } } 

首先要明确的是,每一个让variables都必须在声明时赋值。 所以你的陈述将是

 let id: Int = 0 let firstName: String = "test" let lastName: String = "Test" let email: String? = "Test" 

其次,在类中,你必须初始化variables或将它们定义为可选types,方法是将'?' 要么 '!' 与每个variables。 喜欢

 let id: Int! let firstName: String! let lastName: String! let email: String? 

要么

 let id: Int? let firstName: String? let lastName: String? let email: String? 

但是在这里想要说的是,这些variables是不能改变的,因为它们是常量。 所以如果你在声明的时候没有通过价值,你必须使用var。 在这种情况下你的最终代码将是某种这样的

 var id: Int var firstName: String var lastName: String var email: String?