Swift 4.2) Мутация массива структуры с помощью for_in / forEach против доступа по индексу - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь изменить элемент структуры в массиве.Я обнаружил, что вы можете сделать это путем доступа (итерации) структуры по индексу, но вы не можете, если вы используете цикл for или forEach {}.

struct Person
{
  var age = 0
  var name = "James"
}

var personArray = [Person]()
personArray += [Person(), Person(), Person()]


personArray.forEach({$0.age = 10}) // error: "Cannot assign to property: '$0' is immutable"

for person in personArray { 
  person.age = 10 // error: "Cannot assign to property: 'person' is a 'let' constant"
}


for index in personArray.indices {
  personArray[index].age = 10 // Ok
}

Может кто-нибудь объяснить?

1 Ответ

0 голосов
/ 12 октября 2018

В Swift структура имеет тип значение .В цикле for или foreach элемент person является значением, и если бы он был изменяемым, вы бы изменяли только копию оригинала, а не оригинал, как вы намеревались.

Если вы действительно хотите обновляемую ссылку на struct внутри цикла, добавьте ключевое слово var, но помните, что вы обновляете копию, а не оригинал.

for var person in personArray {
    person.age = 10 // updates a copy, not the original
}

В отличие от этого класс имеет тип reference , и в цикле каждый элемент является ссылкой на оригинал.При обновлении этого ссылочного значения теперь обновляется оригинал.

Измените определение Person на класс вместо struct, и оно будет работать как положено.Для полного объяснения см. https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...