Подтвердить что ты не робот

Переменная "xxx" никогда не мутировалась, подумайте о том, чтобы перейти на "let"

Обновлено до xcode7-beta​​strong > . Я сталкиваюсь с новым видом предупреждения. Вот мой код

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
}

поэтому принудительное разворачивание может забрать его. Но это может быть неправильно?

4b9b3361

Ответ 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. Наилучшая практика