2015-11-13 3 views
7

Ich habe eine Methode, die über ein Array iteriert und andere Methode mit jedem Element als Argument aufrufen. Wenn ich erklären, diese Methode als:Iterieren über eine Sammlung in Swift: var vs. lassen

func didFinishedListFiles(files: [FileModel]) { 
    for var fileData in files { 
     self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!); 
    } 
} 

Xcode eine Warnung zeigt:

Variable 'fileData' was never mutated; consider changing to 'let' constant

Aber wenn ich ändern var-let:

func didFinishedListFiles(files: [FileModel]) { 
    for let fileData in files { 
     self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!); 
    } 
}  

Xcode einen Fehler zeigt:

'let' pattern cannot appear nested in an already immutable context

Wie kann man es ohne Warnungen/Fehler korrekt implementieren?

+4

Isn‘ t es nur 'für fileData in Dateien {...'. Keine var oder lassen benötigt. – Fogmeister

+0

Danke, du hast recht ... ehhh –

+1

Gern geschehen. Ich denke, es macht es implizit zu einem "Let" und wenn Sie das Objekt in der Sammlung mutieren wollen, müssen Sie es explizit als 'var' setzen. – Fogmeister

Antwort

8

Das for-in Muster verwendet implizit eine konstante Bindung (im Rahmen schafft Das heißt, Ihre fileData Bindung wird automatisch eine lokale let und damit konstant für jeweils durch die Schleife

So folgendes.. :

for fileData in files { /*...*/ } 

... entspricht:

var index = 0 
while index < files.count { 
    let fileData = files[index] 
    //... 
    index += 1 
} 

Sie möchten die var zur for - in Bindung nur hinzufügen, wenn Sie diese Bindung mutieren möchten - das heißt, wenn es sich um eine Objektreferenz handelt, die Sie während eines einzelnen Durchgangs durch die Schleife auf etwas anderes zeigen möchten oder ein Werttyp, den Sie ändern möchten. Aber es sieht nicht so aus, als ob Sie eines dieser Dinge tun würden, also wäre die Verwendung von var für diese Bindung hier überflüssig.

(Swift 3 wurde von vielen der Orte zu befreien, wo man implizit unveränderliche Bindungen wandelbar machen konnte, ließ aber for var als Ausnahme -. Es immer noch möglich ist, wenn man etwas in einer Schleife ändern mag)

+1

entfernen Sie das' let' oder 'var' so wird es' für fileData in Dateien "in diesem Fall. –