Swift - обновить объект на месте - PullRequest
0 голосов
/ 23 мая 2019

Если я хочу обновить существующий объект класса, есть ли более простой способ, чем дублирование метода init to update?(мой объект Person имеет около десяти свойств, которые определяются в первую очередь или могут быть отредактированы при более позднем использовании приложения)

проблемы, перечисленные в примере ниже:

  1. повторная инициализация person1 не обновляетсяссылка на объект person1 в массиве parent-child - дочерний массив не содержит обновленный объект

  2. объект person2 ведет себя как требуется (дочерний массив содержит обновленный объект), но использует дублирующийся код инициализатора при обновленииметод «редактирования на месте», который выглядит действительно плохо с точки зрения DRY

любые советы, как это сделать быстро?

import UIKit

class Person {
    var name: String
    var surname: String
    var age: Int?

    init(name: String, surname: String, age: Int? = nil) {
        self.name = name
        self.surname = surname
        self.age = age
    }

    func update(name: String, surname: String, age: Int? = nil) {
        self.name = name
        self.surname = surname
        self.age = age
    }
}
class Parent {
    var child = [Person]()
}

var parent = Parent()

var person1 = Person(name: "John", surname: "Doe")
print(person1.name)
parent.child.append(person1)
person1 = Person(name: "Jack", surname: "Doe")
print(person1.name)

print(parent.child.first!.name)

var person2 = Person(name: "Tom", surname: "Cruise")
print(person2.name)
parent.child.append(person2)
person2.update(name: "Jim", surname: "Cruise")
print(person2.name)

print(parent.child.last!.name)

, чтобы сделать его более понятнымПодумайте о массиве пользовательских профилей, где вы можете добавить новый профиль или отредактировать существующий.и выше проблема заключается в редактировании существующего профиля пользователя

1 Ответ

1 голос
/ 23 мая 2019

Вот объяснение обоих ваших запросов,

1. parent child array содержит reference для объекта person1, т.е. person1 and parent child array хранит ссылку на тот же объект.

var person1 = Person(name: "John", surname: "Doe")
parent.child.append(person1)

Теперь вы назначаете new object to person1 вместо того, чтобы вносить изменения в один и тот же объект, т.е.

person1 = Person(name: "Jack", surname: "Doe")

Это не будет отражено в parent child array. Он по-прежнему будет содержать ссылку на предыдущий объект Person.

По этой причине вы получаете разные значения имени в person1 и parent child array

print(person1.name) //Jack
print(parent.child.first!.name) //John

2. Вместо добавления отдельного метода для обновления объекта - update(name:surname:age:), вы можете просто обновить значения индивидуально, используя . operator в свойствах объекта, т.е.

var person2 = Person(name: "Tom", surname: "Cruise")
parent.child.append(person2)

person2.name = "Jim"

Поскольку в приведенном выше коде вместо назначения нового Person объекта person2, мы просто обновляем его значения.

Итак, person2 и parent child array's object будут по-прежнему reference the same object и, следовательно, будут печатать те же значения name.

print(person2.name) //Tom
print(parent.child.last!.name) //Tom
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...