У меня есть следующий код площадка:мутировать Inout функция параметра Я в асинхронном блоке
import UIKit
import XCPlayground
class A {
var arr : [UIImage] = []
func addItem(inout localArr: [UIImage]) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(2 * NSEC_PER_SEC)), dispatch_get_main_queue()) {() -> Void in
localArr.append(UIImage())
print("from inside function localArr: \(localArr)")
print("form inside function: \(self.arr)")
}
}
}
let a = A()
a.addItem(&a.arr)
print("instant print :\(a.arr)")
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(3 * NSEC_PER_SEC)), dispatch_get_main_queue()) {() -> Void in
print("print after delay: \(a.arr)")
}
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
Выход есть:
instant print :[]
from inside function localArr: [<UIImage: 0x7f99e8706f10>, {0, 0}]
form inside function: []
print after delay: []
Мой вопрос, почему localArr
не то же самое, как self.arr
внутри addItem
и не то же самое, что a.arr
снаружи? Мое предположение состояло в том, что когда я передаю параметр как inout
, я должен иметь возможность работать с фактическим объектом, а не с копией, но, очевидно, это не то, что происходит.
Редактировать: Так спасибо dfri Ответ Я знаю, почему это не работает. inout
действительно call-by-copy-restore, проверьте другой ответ here. Итак, какое-либо предложение о том, как сделать закрытие для привязки к исходному объекту? Или, может быть, я должен использовать другую технику для достижения того, чего хочу?
ваш код и выход не match..please редактировать их –
Edited, один оператор печати отсутствовал внутри 'addItem' функция. – lawicko