从初始化程序返回而不初始化所有存储的属性
我有这样一个简单的类。
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,你必须在init
或init
方法中初始化它,即使它是一个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?