2015-09-01 2 views
0

Из документов компании Apple «Learn the Essentials of Swift»Если константы неизменяемы, почему я могу переназначить их, используя let?

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

Еще в РЕПЛ, я могу это сделать:

14> let favoriteNumber = 4 
favoriteNumber: Int = 4 
15> let favoriteNumber = 5 
favoriteNumber: Int = 5 

Я явно что-то отсутствует: делает это несоответствие нужно сделать с компилятором или выполнения, или что-то еще?

enter image description here

+1

Я бы положил деньги на то, что вы не можете этого сделать. Потому что ты не можешь. Лол. Вы можете показать скриншот этого кода. – Fogmeister

+0

@fogmeister там – softcode

+0

oh, в этом. Я думал, ты имел в виду на детской площадке. Как было сказано ниже. В этом вы ничего не меняете. Вы создаете новую константу, которая имеет одно и то же имя. Попробуйте изменить его, это не сработает. – Fogmeister

ответ

3

Я вижу, как это создает впечатление, что вы меняете значение константы, но на самом деле вы не меняете значение favoriteNumber. Что происходит, вы объявляете новую константу с тем же идентификатором, что и предыдущее объявление. По сути, это скрывает первое объявление, и только если существует только второй избранный номер. Если вы попробуйте следующее:

let favoriteNumber = 4 
favoriteNumber = 5 

Вы увидите, что вам не разрешено изменять значение константы.

Возможно, было бы полезно, если бы REPL выдал предупреждение о том, что вы обновили существующую константу или переменную.

+0

Извините, не понял этого предложения «По сути, это скрывает первое объявление, и если существует только второй избранный номер». – softcode

+0

Вы правы, это делает полный смысл для REPL. – Sulthan

+0

Упрощенное объяснение заключается в том, что компилятор использует создаваемые вами идентификаторы, в данном случае favoriteNumber, для ссылки на адрес в памяти. Например, когда у вас есть свой первый let favoriteNumber = 4, компилятор использует favoriteNumber для ссылки на адрес в памяти, и по этому адресу это значение 4. Когда вы ввели let favoriteNumber = 5, компилятор использует другой адрес в памяти и там помещается значение 5. Первый адрес «скрыт», потому что favoriteNumber теперь ссылается на второй адрес, и у вас нет идентификатора, который соответствует первому адресу. –

5

Вы можете сделать что-то в РЕПЛ, что вы не можете сделать в обычном коде.

Вы не можете повторно назначать константы на игровой площадке или в скомпилированном коде.

Я не уверен, что это специальное удобство, предлагаемое в REPL, или ошибка.