Подтвердить что ты не робот

Возврат из инициализатора без инициализации всех сохраненных свойств

У меня такой простой класс.

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 я получаю следующую ошибку компиляции.

Возврат из инициализатора без инициализации всех сохраненных свойств

Почему это и как я могу его решить?

4b9b3361

Ответ 1

Если свойство постоянное, созданное с помощью let, вы должны инициализировать его на месте или в методе init, даже если это Optional. Если вы хотите, чтобы у вас была возможность настроить электронную почту, вы должны изменить let на var. Другими словами, если вы не инициализируете переменную ни в методе init, ни в классе, то переменная должна быть как var, так и Optional.

Связанные утверждения в docs:

Вы можете назначить значение для свойства константы в любой момент во время инициализации, пока оно будет установлено на определенное значение по истечении времени инициализации. Если для свойства константы присваивается значение, оно не может быть дополнительно изменено.

Для экземпляров класса свойство константы может быть изменено только при инициализации классом, который его вводит. Он не может быть изменен подклассом.

Ответ 2

Вам нужно явно указать значение для электронной почты, поскольку оно является константой.

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

Правило большого пальца:

  • Если вы позволили, вам нужно инициализировать его (даже если это необязательно). Например: let email: String
  • Если у вас есть не необязательный var, вам нужно инициализировать. Например var email: String
  • Если у вас есть необязательный var, вам не нужно его инициализировать. Например var email: String?

Ответ 4

Измените адрес электронной почты с "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

    }
}

Ответ 5

Прежде всего, ясно, что каждой допустимой переменной должно быть присвоено значение во время объявления. Таким образом, ваши заявления будут

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?