2017-02-09 11 views
0
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, то это не означает, что я не использую параметр по умолчанию?
  • Почему я не могу изменить константу по умолчанию с другой?

ответ

2

Вы не можете назначить переменную 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, который устанавливает значения по умолчанию.

class Actor { 
    let agent: String 
    ... 

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

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

Да, это определенно путь, если у вас есть только несколько значений для установки значений по умолчанию. Если у вас больше 2-3, возможно, лучше определить отдельный инициализатор, который не принимает никаких параметров, который устанавливает все значения по умолчанию. – Alexander

+0

@ Александр Парадокс здесь, я не понимаю, вы либо читаете свойства, либо нет. Если вы читаете, то да, мой ответ, мой код должен потерпеть неудачу, так как должен «позволить агенту: String?» ** или это то, что он читает эту строку, но в этот момент ничего не происходит ?! потому что это глупо, потому что он по умолчанию равен нулю и застрял там, как указано [здесь] (http://stackoverflow.com/questions/38942325/constant-unassigned-optional-will-not-be-nil-by-default). В принципе это исключение **, если вы его не читаете, я не должен получать ошибку. – Honey

+0

@Honey Я не понимаю, что вы говорите – Alexander