2015-11-13 1 views
7

Ho un metodo che scorre su una matrice e chiama un altro metodo con ogni elemento come argomento. Se io dichiaro questo metodo come:Iterazione su una raccolta in Swift: var vs let

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

Xcode mostra un avvertimento:

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

Ma se cambio var-let:

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

Xcode mostra un errore:

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

Qual è il modo corretto di implementarlo senza avvisi/errori?

+4

Isn' è semplicemente 'per fileData nei file {...'. Nessuna var o bisogno. – Fogmeister

+0

Grazie, hai ragione ... ehhh –

+1

Prego. Penso che implicitamente lo renda un 'let' e se si desidera mutare l'oggetto nella raccolta, è necessario impostarlo esplicitamente come' var' – Fogmeister

risposta

8

Il for - modello in utilizza implicitamente una costante vincolante (nel campo di applicazione crea Cioè, il tuo fileData vincolante è automaticamente un locale di let, e quindi costante per ogni passaggio attraverso il ciclo

Così il seguente.. :

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

... è equivalente a:

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

Si desidera aggiungere var al binding for - in solo quando si desidera mutare quell'associazione, ovvero se si tratta di un riferimento a un oggetto che si desidera essere in grado di puntare a qualcos'altro durante un singolo passaggio attraverso il ciclo o un tipo di valore che si desidera poter modificare. Ma non sembra che tu stia facendo una di queste cose, quindi usare var per questa associazione sarebbe superfluo qui.

(Swift 3 è sbarazzato di un sacco di luoghi dove si potrebbe fare attacchi implicitamente immutabili mutevole, ma ha lasciato for var come eccezione -. È ancora possibile se si vuole cambiare qualcosa nel corso di un anello)

+1

rimuovere 'let' o' var' in modo che sia 'per fileData in files' in questo caso. –