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

Isu*_*uru 36 class ios swift

我有一个像这样的简单课程.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dán*_*agy 59

如果属性是常量,因此创建时let,您必须在适当位置或init方法中初始化它,即使它是一个Optional.如果您希望能够选择性地设置电子邮件,则应更改letvar.换句话说,如果您没有在init方法或类主体中初始化变量,那么该变量必须是a var和a Optional.

文档中的相关陈述:

只要在初始化完成时将其设置为确定值,就可以在初始化期间的任何时刻为常量属性赋值.为常量属性分配值后,无法进一步修改.

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

  • 如果你使用`let`或`var`并不重要.您必须在初始化程序中设置它以避免此编译错误.我没有使用任何`let`变量也有同样的错误,也出现了这个错误.因此我必须删除或设置此变量以避免此编译错误. (2认同)

Tia*_*ida 25

经验法则是:

  • 如果你已经让,你需要初始化它(即使它是可选的).例如:let email: String
  • 如果您有非可选var,则需要初始化.例如var email: String
  • 如果您有可选的var,则无需初始化它.例如var email: String?


Ona*_*ato 17

您需要为电子邮件显式设置一个值,因为它是一个常量.

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 // <--------------
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Saa*_*aad 6

首先明确每个 let 变量必须在声明时赋值。所以你的陈述将是

let id: Int  = 0
let firstName: String = "test"
let lastName: String = "Test"
let email: String? = "Test"
Run Code Online (Sandbox Code Playgroud)

其次,在类中,您必须初始化变量或通过放置 '?' 将它们定义为可选类型。或者 '!' 与每个变量。喜欢

let id: Int!
let firstName: String!
let lastName: String!
let email: String?
Run Code Online (Sandbox Code Playgroud)

或者

let id: Int?
let firstName: String?
let lastName: String?
let email: String?
Run Code Online (Sandbox Code Playgroud)

但是想在这里告诉你,这些变量将无法更改,因为它们是常量。因此,如果您在声明时未传递值,则必须将 var 与这些一起使用。在这种情况下,您的最终代码将是某种形式

var id: Int
var firstName: String
var lastName: String
var email: String?
Run Code Online (Sandbox Code Playgroud)


Cha*_*van 6

如下将电子邮件从“ 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

    }
}
Run Code Online (Sandbox Code Playgroud)