在下面的代码中,print语句输出“C2”,这是创建闭包的类,作为init参数传递给C1。
class C1 {
let closure: () -> Void
init(closure: @escaping () -> Void) {
self.closure = closure
}
}
class C2 {
func test() {
let c1 = C1(closure: { [unowned self] in
// I would expect "self" to be the C1 instance
print(type(of:self))
})
c1.closure()
}
}
C2().test()
我期待“自我”成为C1实例。为什么不是这样?
答案 0 :(得分:2)
如果您编写代码,请考虑您的期望:
$sqlcmd = "C:\Program Files\Microsoft SQL Server\110\Tools\Binn";
Write-Host "##vso[task.setvariable variable=PATH;]${env:PATH};${sqlcmd}";
他们基本上做同样的事情,但你的版本只是压缩成一行。但是您仍然在类型class C2 {
func test() {
let closure = { [unowned self] in
print(type(of:self))
})
let c1 = C1(closure: closure)
c1.closure()
}
}
的{{1}}方法范围内创建闭包参数。即使你只有一行,闭包参数仍然必须完全创建并存在于test()
方法的范围内,然后 C1才会被实例化。