Переменная "xxx" никогда не мутировалась, подумайте о том, чтобы перейти на "let"
Обновлено до xcode7-betastrong > . Я сталкиваюсь с новым видом предупреждения. Вот мой код
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var attributes: [UICollectionViewLayoutAttributes]? = super.layoutAttributesForElementsInRect(rect)
if let layoutInfo = self.layoutInfo {
attributes?.append(layoutInfo)
}
return attributes
}
предупреждающее сообщение
Variable 'attributes' was never mutated, consider changing to 'let' constant
Почему xcode говорит Variable 'attributes' was never mutated
?
Обновление вопроса
предупреждение исчезает, когда я меняю свой код на
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var attributes: [UICollectionViewLayoutAttributes]? = super.layoutAttributesForElementsInRect(rect)
if let layoutInfo = self.layoutInfo {
attributes!.append(layoutInfo)
}
return attributes
}
поэтому принудительное разворачивание может забрать его. Но это может быть неправильно?
Ответы
Ответ 1
Они говорили об этом в видеороликах WWDC и заметках о выпуске.
Всегда было так, что вы получаете гораздо большую производительность (более быструю скорость, меньшее пространство), если вы используете let
вместо var
, когда можете. Это говорит компилятору, что эта вещь является константой, а не переменной, и этот факт позволяет компилятору оптимизировать всевозможные вещи.
Но компилятор не может этого сделать, если вы не используете let
, когда можете. Он не изменит var
на let
для вас.
Поэтому в Swift 2 компилятор делает более разумный анализ во время сборки и предупреждает вас, если вы используете var
, где вы могли бы использовать let
. В конце концов эта функция будет работать правильно, после чего вы должны принять совет компилятора!
Ответ 2
Это тоже сводило меня с ума. Всякий раз, когда у меня есть класс, и я изменяю свойства элемента, он все равно говорит мне, что я должен сделать переменную константой. Например:
class X {
var name = ""
}
var xInstance = X()
xInstance.name = "my name"
Рядом, как я могу понять, компилятор прав. xInstance - постоянная. Ему присваивается указатель на экземпляр X во время его инициализации и ему никогда не присваивается другое значение. Таким образом, xInstance является постоянным. Класс, на который он указывает, не является постоянным.
Это более очевидно на языке, таком как C или С++, но когда вы понимаете, что все экземпляры классов действительно указывают на кучу поддерживаемых классов, это имеет смысл.
Для тех, кто понимает С++
xInstance эквивалентно:
X *xInstance
делает его let вместо этого означает, что он изменяется на:
X * const xInstance
Я думаю, что большинство людей интуитивно думают, что быстрая декларация будет эквивалентна
X const * xInstance
Ответ 3
Объявив константу с помощью let
, вы убедитесь, что ее нельзя изменить. Это полезно для того, чтобы вы случайно не изменили его позже, и это (теоретически) может помочь оптимизатору генерировать более быстрый код.
Если вы объявляете переменную с var
, и вы не собираетесь ее изменять или вызывать на ней методы мутации, использование let
вместо этого поможет вам выполнить этот контракт.
Ответ 4
В вашем коде подразумевается, что attributes
может быть изменен, если self.layoutInfo
не равен nil
Возможно, предупреждение указывает, что ни один путь не приводит к тому, что self.layoutInfo
не имеет значения nil и, следовательно, атрибутам не нужно быть var.
Изучите, какие условия, если они могут привести к self.layoutInfo
, имеющим данные
Ответ 5
Вы создали этот объект как объект var, но значение этого объекта не меняется, а затем лучше его разрешить. Это.
В соответствии с Руководством разработчика Apple, создайте объект var, если значение этого объекта будет изменено, иначе создайте переменную let. Наилучшая практика