2015-02-06 4 views
1

Как Apple, Документация говорит:Swift: когда следует использовать «var» вместо «let»?

Использование let сделать постоянным и var сделать переменную. Значение константы не обязательно должно быть известно во время компиляции, но вы должны присвоить ему значение ровно один раз. Это означает, что вы можете использовать константы для определения значения, которое вы определяете один раз, но используемого во многих местах.

Рассмотрим некоторый класс:

class A { 
    var a = [String]() 
} 

Поскольку массив a изменчива, она определяется через var. Но что, если мы рассмотрим класс B, где экземпляр A является свойством?

class B { 
    let b = A() 
} 

Даже если b изменчиво, let ключевого слова будет хорошо, потому что ссылка не будет изменена. С другой стороны, var тоже будет в порядке, потому что содержимое b может быть изменено. Что я должен выбрать в этом примере - let или var?

+0

вы всегда можете использовать 'var', где вы можете использовать' let'. 'let' сообщает остальной части вашей программы, что этот элемент не может быть повторно назначен. – njzk2

+1

Вы видели [В чем разница между' let' и 'var' в swift?] (http://stackoverflow.com/questions/ 24002092/what-is-the-difference-between-let-and-var-in-swift)? –

+2

Я обычно просто наклоняюсь назад, чтобы все было как можно. неизменяемый> изменяемый, и хотя это не имеет значения в вашем втором примере, я помещаю это, чтобы напомнить мне об этом. –

ответ

8

Использовать let всякий раз, когда вы можете. Используйте var, когда нужно. Сделать вещи неизменными делает много ошибок невозможными, поэтому это должен быть ваш выбор по умолчанию. По возможности установите все свои значения в init и никогда не меняйте их. Аналогичным образом, вы должны использовать struct, когда можете, и class, когда вы должны (хотя по моему опыту этого труднее достичь, чем с помощью let).

В этом примере, если вы не можете установить A.a во время инициализации, то да, это должно быть var. Но в вашем примере нет необходимости использовать var для B.b. (И нет причин в любом случае использовать class, по крайней мере, так, как вы представили вопрос.)

2

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

class Head { 
    var hairs = [String]() 
} 

class Person { 
    let head = Head() 
} 

В этом примере, человек имеет ровно одну голову, и в течение всей жизни каждого Person, его/ее голова всегда была та же голова. Однако волосы головы могут расти, выпадать или иным образом меняться. Person Право собственности на эту головку не влияет на отношение Head к ее волосам.

Как упоминалось в Rob, вы всегда должны использовать let, если у вас нет веской причины не делать этого. Неизменность - ваш друг, когда дело доходит до рассуждений о поведении программы.

1

Используйте, если ваш объект не изменил свое значение после того, как было установлено значение. Используйте var, если ваш объект может изменить его значение более 1 раза.

'let' предназначен для постоянных. «var» - это переменная.

Однако постоянное ограничение применяется только к объекту, но не его атрибутам, если объект является экземпляром класса (значение передается по ссылке). В зависимости от типа этих атрибутов (константа или переменная) мы можем изменить их значение после. Это не относится к структуре.

Например:

class VideoMode { 
    var interlaced = false 
    var frameRate = 0.0 
    var name: String? 
} 

в функции, вы объявите

let vm = VideoMode() 
print("starting framerate is \(vm.frameRate)") // -> print starting framerate is 0.0 
vm.frameRate = 20.0 
print("framerate now is \(vm.frameRate)") // -> print framerate now is 20.0 

//we can change .frameRate later to 10.0, there is no compile error 
vm.frameRate = 10.0 
print("framerate now is \(vm.frameRate)") // -> print framerate now is 10.0 
Смежные вопросы