Когда экземпляр класса инициализируется, какова последовательность?

class Actor {
    let agent: String? = "nobody"

    init(agent: String){
        self.agent = agent // error: immutable value 'self.agent' may only be initialized once
    }
}

let John = Actor(agent: "xyz")

Я запутался в последовательности, которая происходит здесь (я полностью осознаю различия между var и let). Но почему я получаю эту ошибку?

  • Если я использую метод init, то это не значит, что я не использую параметр по умолчанию?
  • Почему я не могу изменить константу по умолчанию на другую?

Ответ 1

Вы не можете назначить переменную let более одного раза, однако вы можете определить ее и оставить ее неинициализированной. Затем в вашем методе init вы можете иметь "nobody" как значение по умолчанию для аргумента agent.

class Actor {
    let agent: String

    init(agent: String = "nobody"){
        self.agent = agent
    }
}

print(Actor().agent) // "nobody"
print(Actor(agent: "xyz").agent) // "xyz"

Как предложил Александр в комментариях ниже, если у вас слишком много аргументов в методе init, значения по умолчанию могут немного запутаться. Рассмотрим создание отдельного метода init, который устанавливает значения по умолчанию.

class Actor {
    let agent: String
    ...

    init() {
        self.agent = "nobody"
        ...
    }

    init(agent: String, ...){
        self.agent = agent
        ...
    }
}