【发布时间】:2016-05-04 07:01:09
【问题描述】:
我有以下操场代码:
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 与addItem 内部的self.arr 不同,而与外部的a.arr 不同?我的期望是,当我将参数作为inout 传递时,我应该能够对实际对象进行操作,而不是对副本进行操作,但显然这不是发生的情况。
编辑:感谢 dfri 的回答,我知道为什么这不起作用。 inout 真的是call-by-copy-restore,检查另一个答案here。现在,关于如何实际使闭包捕获对原始对象的引用的任何建议?或者也许我应该使用其他技术来实现我想要的?
【问题讨论】:
-
您的代码和输出不匹配..请编辑它们
-
已编辑,
addItem函数内部缺少一条打印语句。
标签: ios swift closures swift-playground