为什么关闭中的self不是指拥有的类实例?

时间:2017-09-11 03:13:32

标签: swift closures

在下面的代码中,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实例。为什么不是这样?

1 个答案:

答案 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才会被实例化。