Массивы в swift являются структурами и поэтому передаются по значению. Я вижу, вы передаете массив как inout, так что вы уже знаете это. У меня была эта проблема пару раз, и в конце концов я обманул.
Cheat 1: передать ссылку на Root в TestOperation и вызвать метод Root, который добавляет значение в общий массив. Вы можете сделать это чище с протоколом.
Чит 2. Создание класса, который оборачивает общий массив и имеет методы для обновления обернутого массива.
В обоих случаях я передал бы индекс для использования в TestOperation вместо того, чтобы выводить его из содержимого массива. Отчисления могут зависеть от времени.
Я знаю, что это скорее предотвращение, чем решение проблемы, но иногда жизнь слишком коротка.
Вот суть, не проверенная:
protocol TestOperationProtocol: class {
function setValue(index: Int, value: Int)
}
class TestOperation: Operation {
weak var owner: TestOperationProtocol
let index: Int
override var isExecuting: Bool { ... }
override var isFinished: Bool { ... }
init(owner: TestOperationProtocol, index: Int) {
self.owner = owner
self.index = index
}
override func start() {
// calculate value
let value = self.index
self.owner?.setValue(self.index, value)
}
}
class Root: TestOperationProtocol {
var sharedArr: [Int?];
var queue: OperationQueue;
init() {
sharedArr = Array(repeating: nil, count: 3);
queue = OperationQueue.init();
for i in 0...sharedArr.count {
let operation = TestOperation.init(self, index: index);
queue.addOperation(operation);
}
}
func setValue(index: Int, value: Int) {
sharedArray[index] = value
}
}
Протокол позволяет разорвать цикл зависимости. TestOperation зависит от TestOperationProtocol, а не от Root. Корень зависит от TestOperation и его протокола.