我有一个像这样的简单课程。
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中,我得到以下编译错误。
从初始化程序返回,而不初始化所有存储的属性
为什么这样,我该如何解决?
答案 0 :(得分:44)
如果属性是常量,因此使用let
创建,则必须使用init
方法对其进行初始化,即使它是Optional
。如果您希望能够选择性地设置电子邮件,则应将let
更改为var
。换句话说,如果您没有在init方法或类主体中初始化变量,那么该变量必须是var
和Optional
。
docs中的相关陈述:
您可以在初始化期间的任何时刻为常量属性赋值,只要在初始化完成时将其设置为确定值即可。为常量属性分配值后,无法进一步修改。
对于类实例,只能在引入它的类初始化期间修改常量属性。它不能被子类修改。
答案 1 :(得分:21)
经验法则是:
let email: String
var email: String
var email: String?
答案 2 :(得分:15)
您需要为电子邮件显式设置一个值,因为它是一个常量。
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 // <--------------
}
}
或者正如其他人提到的那样,您可以将电子邮件更改为变量。
答案 3 :(得分:5)
更改来自&#34; let&#34;的电子邮件去&#34; var&#34;如下。
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
}
}
答案 4 :(得分:4)
首先要明确每个let变量必须在声明时赋值。所以你的陈述将是
let id: Int = 0
let firstName: String = "test"
let lastName: String = "Test"
let email: String? = "Test"
其次在类中,您必须通过放置'?'来初始化变量或将它们定义为可选类型要么 '!'每个变量。喜欢
let id: Int!
let firstName: String!
let lastName: String!
let email: String?
或
let id: Int?
let firstName: String?
let lastName: String?
let email: String?
但是我想在这里说这些变量不能改变,因为它们是常量。因此,如果您在声明时未传递值,则必须使用var。在这种情况下,您的最终代码将是某种
var id: Int
var firstName: String
var lastName: String
var email: String?