La variable 'xxx' n'a jamais été mutée, pensez à changer pour 'let'
Mis à jour à xcode7-bêta j'ai couru à travers une nouvelle sorte 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 ne xcode dire Variable 'attributes' was never mutated
?
Question De Mise À Jour
l'avertissement est allé quand j'ai modifier mon code pour ce
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var attributes: [UICollectionViewLayoutAttributes]? = super.layoutAttributesForElementsInRect(rect)
if let layoutInfo = self.layoutInfo {
attributes!.append(layoutInfo)
}
return attributes
}
donc contraint d'ôter peut l'emporter. Mais c'est peut-être pas une bonne chose non?
source d'informationauteur dopcn
Vous devez vous connecter pour publier un commentaire.
Ils ont parlé à ce sujet dans la WWDC vidéos et les notes de version.
Il a toujours été le cas que vous obtenez beaucoup, de bien meilleures performances (vitesse plus rapide, plus petit espace) si vous utilisez
let
au lieu devar
chaque fois que vous le pouvez. Elle indique au compilateur que cette chose est un constantepas une variable, et de ce fait permet au compilateur d'optimiser toutes sortes de choses.Mais le compilateur ne peut pas le faire sauf si vous ne utilisation
let
chaque fois que vous le pouvez. Il ne changera pas d'unvar
à unlet
pour vous.Donc, dans Swift 2, le compilateur ne plus intelligents d'analyse au moment de la construction et vous avertit si vous utilisez
var
où vous pourriez avoir utilisélet
. Finalement, cette fonction fonctionne correctement, au point où vous devez prendre le compilateur de conseils!!!Cela a été me rend fou aussi. Chaque fois que j'ai une classe et j'ai modifier les propriétés de membre, elle toujours me dit que je devrais faire de la variable constante. Par exemple:
Près que je peux figure, le compilateur est correct. xInstance est une constante. Il est attribué le pointeur vers le X de l'instance lors de son initialisation, et n'est jamais attribué à une autre valeur. Donc xInstance est constante. La classe qu'il indique n'est pas constante.
C'est encore plus évident dans un langage comme C ou C++, mais quand vous vous rendez compte que toutes les instances de classe sont vraiment des pointeurs vers des tas adossés à des classes, cela fait sens.
Pour ceux qui comprennent C++
xInstance est équivalent à:
faire un laisse au lieu de cela signifie qu'il passe à:
Je pense que la plupart des gens intuitivement penser que la swift déclaration serait équivalent à
Par la déclaration d'une constante avec
let
vous vous assurez qu'elle ne peut jamais être changé. C'est bon de s'assurer que vous n'avez pas accidentellement le changer plus tard, et il (en théorie) peut aider à l'optimiseur de générer plus rapidement le code.Si vous déclarez une variable avec
var
et vous n'avez pas l'intention de le modifier ou l'appel de la mutation des méthodes, à l'aide delet
au lieu de cela vous aide à faire respecter ce contrat.Votre code implique que
attributes
pourraient être muté siself.layoutInfo
est non nulPeut-être l'avertissement en disant qu'aucun chemin mène à
self.layoutInfo
étant non nul, et donc des attributs n'a pas besoin d'être une var.Examiner quelles conditions si l'un peut conduire à
self.layoutInfo
d'avoir des donnéesVous avez créé l'objet en tant que var objet, mais de la valeur de l'objet ne change pas, puis après préférable de le laisser. C'est tout.
Que par des Développeurs d'Apple de lignes Directrices, de créer var objet si la valeur de cet objet va changer le reste de créer laissez variable. Les meilleures pratiques