2015-11-13 8 views
7

Mam metodę iteracji przez tablicę i wywołuj inną metodę z każdym elementem jako argumentem. Jeśli oświadczam tę metodę jako:Iterowanie nad kolekcją w Swift: var vs. let

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

Xcode pokazuje ostrzeżenie:

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

Ale jeśli zmienię var do let:

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

Xcode pokazuje błąd:

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

Jak jest prawidłowy sposób wdrożenia go bez ostrzeżeń/błędów?

+4

nieprawdaż t to po prostu 'dla fileData w plikach {...'. Bez var lub niech potrzebne. – Fogmeister

+0

Dzięki, masz rację ... ehhh –

+1

Nie ma za co. Myślę, że niejawnie sprawia, że ​​jest to "let" i jeśli chcesz zmutować obiekt w kolekcji, musisz jawnie ustawić go jako 'var' – Fogmeister

Odpowiedz

8

for - in wzór domyślnie używa stałej wiązania (w zakresie nie tworzy Oznacza to, że Twój fileData wiązania automatycznie lokalnego let, a więc stała na każdym przejściu przez pętlę

Więc następujące.. :

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

... jest równoważny:

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

Użytkownik chce dodać var do powiązania for - in tylko wtedy, gdy chce zmutować to powiązanie - to znaczy, jeśli jest to odwołanie do obiektu, które można wskazać na coś innego podczas jednego przejścia przez pętlę lub typ wartości, którą chcesz zmienić. Ale wygląda na to, że nie robisz żadnej z tych rzeczy, więc użycie tutaj var byłoby tutaj zbyteczne.

(Swift 3 pozbył dużo miejsc, gdzie można zrobić w sposób dorozumiany niezmienne Wiązania zmienny, ale w lewo for var jako wyjątek. - to wciąż możliwe, jeśli chcesz coś zmienić w trakcie pętli)

+1

usuń' let' lub 'var', więc będzie to' dla fileData w pliki "w tym przypadku. –