Как обновить массив, переданный в качестве параметра при инициализации, когда новые элементы добавляются в исходный массив - PullRequest
0 голосов
/ 04 сентября 2018

Скажем, например, у меня есть массив, который нужно использовать в нескольких классах, если мне нужен работник для обновления значений этого массива, как мне сделать так, чтобы при добавлении новых значений в указанный массив рабочий объект значение также меняется.

Пример:

class Object {
    var id: Int
    var foo: String
    var bar: Int

    init(id: Int, foo: String, bar: Int) {
        self.id = id
        self.foo = foo
        self.bar = bar
    }
}

class ObjectWorker {
    var objects: [Object]

    init(objects: [Object]) {
        self.objects = objects
    }

    func updateObjects(withId id: Int) {
        self.objects.forEach { $0.foo = "a different value" }
    }
}


class SomeClass {

    // this declaration will happen on more than one class
    var objects: [Object] = ... // let's just say there are 10 objects here
    lazy var worker = ObjectWorker(objects: self.objects)

    init() {
        // to initialize the workers
        _ = worker

        print(objects.count) // 10
        print(worker.objects.count) // 10

        let newObjects: [Object] = ... // let's say this has 5 new values
        objects.append(contentsOf: newObjects)

        print(objects.count) // 15
        print(worker.objects.count) // 10
    }
}

Я попытался сделать инициализацию ObjectWorker параметром inout, подобным этому init(objects: inout [Object], но даже тогда результат остается тем же. updateObjects работает, даже если init не является параметром inout.

Примечание :

  1. Я знаю, что могу сделать это, используя ObjectWorker в качестве контейнера объектов вместо того, что здесь происходит в настоящее время, но есть ли способ сделать это без этого?

  2. Вместо этого я могу использовать статические функции, но давайте не будем идти туда

1 Ответ

0 голосов
/ 06 сентября 2018

Как уже упоминалось, Swift Arrays являются типами значений, поэтому ObjectWorker получает копию массива. Если вы не хотите использовать ObjectWorker в качестве контейнера, вместо этого вы можете использовать NSArray (который является ссылочным типом).

...