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?
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!
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
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.
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
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