2015-03-22 2 views
3

Привет всем Я пытаюсь понять, почему приведенный ниже код позволяет мне назначить новое значение для строки wee в моем классе. Я думал, что пусть будет неизменным, но он работает здесь. Может кто-то объяснит это. Благодарю.Swift let изменен в классах почему?

import Foundation 


class MyClass { 
    let wee:String 

    init?(inInt:Int) { 
     let j:String = "what" 
     //j = "I shouldn't be able to do this wiht let" // error rightly so 
     //println(j) 
    self.wee = "wow" 
    if inInt != 2 { 
     return nil 
    } 
    self.wee = "hey" 
    self.wee = "blas" // I shouldn't be able to do this 
} 


} 

if let myClass:MyClass = MyClass(inInt: 2) { 
myClass.wee // prints blas 
} 
+3

Swift 1.2 должен позволить вам отложить настройку переменной let, чтобы вы могли принять решение о том, что ей назначить, но она должна работать только один раз, и после ее установки она должна быть константой AFAIK. – clearlight

ответ

3

«Изменение констант свойств во время инициализации» заголовок под Initialization разделом Свифт Язык программирования говорит:

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

Чтение между строками и рассмотрение вашего примера звучит очень похоже на то, что ограничения на установку значения константы не применяются к инициализации. Кроме доказательства, подтверждающие, что идея появляется раньше в том же разделе:

При присвоении значения по умолчанию хранимого имущества, или его начального значения в пределах инициализатора, значение этого свойства устанавливается напрямую, без называя любого наблюдателя за имуществом.

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

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

+1

Намного понятнее. Благодаря! –

1

Поскольку вы назначаете его в инициализаторе в точке, когда объект этого класса создается. Я просто предполагаю, что он принимает любое последнее заданное значение, а затем создает константу.
Если вы попробуете то же самое в разных функциях, это не сработает. Вы получите ошибку.

+0

Я тоже поднял голову и выяснил, что это то, что происходит. После инициализации переменная get преобразуется в константу. Я попытался изменить его после того, как создал класс, и это не позволило бы мне, если бы я не допустил var в классе. Казалось странным. Спасибо за объяснение! –

 Смежные вопросы

  • Нет связанных вопросов^_^