2015-11-13 2 views
7

У меня есть метод, который выполняет итерацию по массиву и вызывает другой метод с каждым элементом в качестве аргумента. Если я объявляю этот метод:Итерация по коллекции в Swift: var vs. let

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

Xcode показывает предупреждение:

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

Но если я изменю var к let:

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

Xcode показывает ошибку:

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

Как правильно реализовать его без каких-либо предупреждений/ошибок?

+4

Isn» t это просто 'для fileData в файлах {...'. Нет var или let need. – Fogmeister

+0

Спасибо, ты прав ... ehhh –

+1

Добро пожаловать. Я думаю, что это неявно делает его «let», и если вы хотите мутировать объект в коллекции, тогда вы должны явно указать его как «var» – Fogmeister

ответ

8

for - in модель неявно использует константу связывания (в объеме он создает То есть, ваше fileData связывание автоматически локальный let, и, следовательно, постоянную для каждого прохода через петлю

Так следующее.. :

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

... эквивалентно:

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

Вы хотите добавить var в ссылку for - in, если вы хотите изменить эту привязку, то есть, если это ссылка на объект, которую вы хотите указать на что-то еще за один проход через цикл , или тип значения, который вы хотите изменить. Но это не похоже на то, что вы делаете одну из этих вещей, поэтому использование этой привязки будет var.

(Swift 3 избавился от многих мест, где вы могли бы сделать неявно неизменные привязок изменчивыми, но оставил for var как исключение. - это все-таки возможно, если вы хотите изменить что-то во время цикла)

+1

, чтобы удалить 'let' или' var', поэтому он будет 'для fileData в файлов' в этом случае. –

Смежные вопросы