В массиве, содержащем объекты, изменение свойства одного элемента не меняет сам объект - PullRequest
1 голос
/ 20 марта 2019

Этого не произойдет, если я просто изменю свойства вместо замены ссылки на новый объект.

Вот класс Person , который является ссылочным типом,

class Person {
    var firstName: String
    var lastName: String
    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }
}

Вот пример Person ,

var someone = Person(firstName: "Johnny", lastName: "Appleseed")

, затем я создаю массив, содержащий значения типа Person

var lotsOfPeople = [someone, someone, someone]

Полагаю lotsOfPeople содержит 3 ссылки на кого-то .Но если я изменю третье значение в lotsOfPeople,

lotsOfPeople[2] = Person(firstName: "Lucy", lastName: "Swift")

кто-то само не изменится.

print(someone.firstName) // Johnny

Я думаю, что это означает lotsOfPeople [2] не является ссылкой на кого-то .Как это могло произойти?

1 Ответ

4 голосов
/ 20 марта 2019

Проблема в том, что вы заменяете ссылку на lotsOfPeople[2], чтобы указать на новый объект. Поэтому оригинал Person не изменяется.

Если бы вы сделали lotsOfPeople[2].firstName = "Lucy", то это изменилось бы.

Или сделать:

let person = lotsOfPeople[2]
person.firstName = "Lucy"

тогда вы также увидите оригинальное изменение.

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