在闭包中弱捕获self的命名约定

时间:2017-09-01 10:11:06

标签: swift

因为这强烈捕获了self,它在执行闭包之前可能已超出范围:

OperationQueue().addOperation {
    self.someFunction()
}

......在这些情况下,我会轻微捕获self并使用警卫检查它仍在范围内。

我曾经这样写过:

OperationQueue().addOperation { [weak self] in
    guard let `self` = self else { return }

    self.someFunction()
}

但是后来发现只有编译错误才能正常工作! https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html

所以现在我使用不同的常量名称。读其他民族'我看到的最常见的代码是:

OperationQueue().addOperation { [weak self] in
    guard let weakSelf = self else { return }

    weakSelf.someFunction()
}

但是当然self对那个后卫很强大?所以应该这样写:

OperationQueue().addOperation { [weak self] in
    guard let strongSelf = self else { return }

    strongSelf.someFunction()
}

是否有最佳方式来编写此内容?

-

更新 - 为什么在这种情况下,可选链接不是最佳选择:

如果闭包中有多个self调用,并且self在执行闭包期间超出了范围,那么最终可能会出现意外状态。

还有一名警卫向下一位开发人员显示此功能需要self才能正常工作,即在没有self的情况下运行闭包没有意义。

2 个答案:

答案 0 :(得分:4)

从Swift 4.2开始,您可以使用guard let self = self else { return }来展开weak self。无需使用strongSelf`self`编译器错误进行解包。
您可以在Swift evolution proposal中阅读有关它的更多信息。

答案 1 :(得分:0)

您可以通过以下方式为对象指定捕获列表中的名称:

OperationQueue().addOperation { [weak object = self] in
    guard let object = object else { return }
    object.someFunction()
}