it-swarm.com.de

Variable 'xxx' wurde nie mutiert. Ändern Sie 'let'.

Auf xcode7-beta aktualisiert Ich stoße auf eine neue Art von Warnung. Hier ist mein Code

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

die Warnmeldung lautet Variable 'attributes' was never mutated, consider changing to 'let' constant

Warum sagt xcode Variable 'attributes' was never mutated?

Fragen-Update

die Warnung ist weg, wenn ich meinen Code in diesen Code ändere

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

so kann erzwungenes Abwickeln es wegnehmen. Aber es ist vielleicht keine gute Sache, richtig?

14
dopcn

Sie sprachen darüber in den WWDC-Videos und den Release Notes.

Wenn Sie let anstelle von var verwenden, erhalten Sie immer eine viel bessere Leistung (höhere Geschwindigkeit, weniger Speicherplatz). Dies sagt dem Compiler, dass dieses Ding eine Konstante ist, keine Variable, und diese Tatsache ermöglicht es dem Compiler, alle möglichen Dinge zu optimieren.

Der Compiler kann dies jedoch nur, wenn Sie do let verwenden, wann immer Sie können. Eine var wird nicht in eine let für you geändert.

Daher führt der Compiler in Swift 2 eine intelligentere Analyse zum Zeitpunkt der Erstellung durch und warnt Sie, wenn Sie var verwenden, wo Sie let verwenden könnten. Eventuell funktioniert diese Funktion einwandfrei. Dann sollten Sie den Rat des Compilers befolgen! 

21
matt

Das hat mich auch verrückt gemacht. Immer wenn ich eine Klasse habe und die Eigenschaften eines Mitglieds ändere, sagt es mir immer noch, dass ich die Variable zu einer Konstanten machen soll. Zum Beispiel:

class X { 
    var name = ""
}

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

Der Compiler ist, so wie ich es beurteilen kann, richtig. xInstance ist eine Konstante. Es wird der Zeiger während der Initialisierung auf die X-Instanz und nie einen anderen Wert zugewiesen. XInstance ist also konstant. Die Klasse, auf die es zeigt, ist nicht konstant. Dies ist in einer Sprache wie C oder C++ offensichtlicher. Wenn Sie jedoch feststellen, dass alle Klasseninstanzen wirklich Zeiger sind, um gesicherte Klassen zu sammeln, ist dies sinnvoll. 

Für diejenigen, die C++ verstehen

xInstance entspricht:

X *xInstance

wenn Sie es zu einem Let machen, bedeutet dies, dass es sich ändert zu:

X * const xInstance

Ich denke, dass die meisten Leute intuitiv denken würden, dass die Swift-Deklaration der gleichen wäre

X const * xInstance
10
Greg Veres

Durch die Deklaration einer Konstanten mit let stellen Sie sicher, dass diese niemals geändert werden kann. Dies ist gut, um sicherzustellen, dass Sie es nicht versehentlich später ändern, und es (theoretisch) kann dem Optimierer dabei helfen, schnelleren Code zu generieren. 

Wenn Sie eine Variable mit var deklarieren und nicht beabsichtigen, sie zu ändern oder Mutationsmethoden aufzurufen, können Sie stattdessen let verwenden, um diesen Vertrag durchzusetzen. 

2
rickster

Ihr Code impliziert, dass attributes mutiert werden könnte, wenn self.layoutInfo nicht null ist 

Vielleicht heißt die Warnung, dass kein Pfad dazu führt, dass self.layoutInfo nicht null ist, und daher müssen Attribute keine Variablen sein.

Untersuchen Sie, unter welchen Bedingungen self.layoutInfo Daten enthalten kann

1
Warren Burton

Sie haben dieses Objekt als var-Objekt erstellt, aber der Wert dieses Objekts ändert sich nicht, bevor es besser gemacht wird. Das ist es. 

Erstellen Sie ein var-Objekt gemäß den Apple Developer Guidelines, falls sich der Wert dieses Objekts ändern wird. Beste Übung

1
Nilesh Patel