web-dev-qa-db-fra.com

La variable 'xxx' n'a jamais été mutée, envisagez de changer en 'let'

Mise à jour vers xcode7-beta Je rencontre un nouveau type d'avertissement. Voici mon code

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    var attributes: [UICollectionViewLayoutAttributes]? = super.layoutAttributesForElementsInRect(rect)
    if let layoutInfo = self.layoutInfo {
        attributes?.append(layoutInfo)
    }
    return attributes
}

le message d'avertissement est Variable 'attributes' was never mutated, consider changing to 'let' constant

Pourquoi xcode dit Variable 'attributes' was never mutated?

Mise à jour de la question

l'avertissement est parti quand je change mon code à cette

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    var attributes: [UICollectionViewLayoutAttributes]? = super.layoutAttributesForElementsInRect(rect)
    if let layoutInfo = self.layoutInfo {
        attributes!.append(layoutInfo)
    }
    return attributes
}

le déballage forcé peut l'emporter. Mais cela pourrait ne pas être une bonne chose non?

14
dopcn

Ils en ont parlé dans les vidéos et les notes de publication de la WWDC.

Vous avez toujours obtenu de bien meilleures performances (vitesse plus rapide, espace réduit) si vous utilisez let au lieu de var chaque fois que vous le pouvez. Cela indique au compilateur que cette chose est un constant , pas une variable, ce qui permet au compilateur d’optimiser toutes sortes de choses.

Mais le compilateur ne peut le faire que si vous faites utilisez let chaque fois que vous le pouvez. Cela ne changera pas une var en une let pour vous.

Par conséquent, dans Swift 2, le compilateur effectue une analyse plus intelligente au moment de la construction et vous avertit si vous utilisez var là où vous auriez pu utiliser let. Finalement, cette fonctionnalité fonctionnera correctement. Vous devrez alors suivre les conseils du compilateur! 

21
matt

Cela m'a rendu fou aussi. Chaque fois que j'ai une classe et que je change les propriétés de membre, cela me dit toujours que je devrais faire de la variable une constante. Par exemple:

class X { 
    var name = ""
}

var xInstance = X()
xInstance.name = "my name"

Aussi proche que je puisse comprendre, le compilateur est correct. xInstance est une constante. Le pointeur de l'instance X lui est attribué lors de son initialisation et aucune autre valeur n'est jamais affectée. Donc, xInstance est constante. La classe à laquelle il renvoie n'est pas constante. C'est plus évident dans un langage comme le C ou le C++, mais lorsque vous réalisez que toutes les instances de classe sont en réalité des pointeurs vers des classes sauvegardées en tas, cela a du sens. 

Pour ceux qui comprennent le C++

xInstance est équivalent à:

X *xInstance

en faire un let signifie plutôt qu'il change comme suit:

X * const xInstance

Je pense que la plupart des gens penseraient intuitivement que la déclaration de Swift équivaudrait à

X const * xInstance
10
Greg Veres

En déclarant une constante avec let, vous vous assurez qu'elle ne pourra jamais être changée. Cela permet de s’assurer que vous ne le modifiez pas par accident plus tard, et cela (en théorie) peut aider l’optimiseur à générer du code plus rapide. 

Si vous déclarez une variable avec var et que vous n'avez pas l'intention de la modifier ou d'appeler des méthodes de mutation sur celle-ci, utiliser let vous aidera à appliquer ce contrat. 

2
rickster

Votre code implique que attributes peut être muté si self.layoutInfo est non nul 

L'avertissement dit peut-être qu'aucun chemin ne conduit à ce que self.layoutInfo soit non nul et par conséquent, attribut n'a pas besoin d'être un var.

Examiner les conditions éventuelles pouvant conduire à avoir self.layoutInfo des données

1
Warren Burton

Vous avez créé cet objet en tant qu'objet var, mais la valeur de cet objet ne change pas, mais il est préférable de le laisser. C'est tout. 

Conformément aux instructions pour les développeurs Apple, créez un objet var si la valeur de cet objet va changer, sinon créez une variable let. Meilleure pratique

1
Nilesh Patel