swift - 在 swift 中将函数与闭包“弱自我”作为参数传递
问题描述
在很多示例中,人们使用闭包将函数作为参数传递:
sum.getSumOf(array: [1,2,3]) { [weak self] sum in
self?.result = sum
print(self?.result as Any)
}
我知道这是为骑自行车问题而做的。但是传递一个函数而不是一个闭包呢?如何使此功能“弱”?
例如:
class Calculator {
let sum = Sum()
var result = 0
// passing a function
func doSum() {
sum.getSumOf(array: [1,2,3], handler: store(sum:))
}
// vs use closure
func doSumWeakSelf() {
sum.getSumOf(array: [1,2,3]) { [weak self] sum in
self?.result = sum
print(self?.result)
}
}
func store(sum:Int){
result = sum
print(result)
}
}
class Sum {
func getSumOf(array:[Int], handler: ((Int)->Void)) {
//step 2
var sum: Int = 0
for value in array {
sum += value
}
handler(sum)
}
}
解决方案
首先,在您的示例中,根本不需要weak
。没有保留循环,因为处理程序没有转义。它立即执行并释放。您不应该weak
在没有保留循环的情况下使用。
即使在转义的情况下,也可能并不总是有一个保留循环,因为最终可能会释放闭包。但是,当有@escaping
注释时,您只能通过文档真正了解这一点。
也就是说,对于您的具体问题,在此示例中:
func doSum() {
sum.getSumOf(array: [1,2,3], handler: store(sum:))
}
这会捕获self
(因为它是 的隐式参数store(sum:)
),并且不可能self
使用这种语法使弱。在这种情况下没关系,因为没有保留循环,但如果有,如果您选择以这种方式传递方法,您将无法解决它。
推荐阅读
- sql - 使用 Substring 从列中检索部分字符串并处理
- r - 修改现有的 R Color Brewer 调色板
- ios - 如何使用具有不同领域类的一个视图控制器
- hyperledger-fabric - 在超级账本结构中执行事务时如何解决超时错误?
- javascript - 无法在 Chrome 中设置 document.cookie
- visual-studio - Angular 项目中的 Visual Studio 2017 TS2304 和 TS2583 错误,但 ng build 工作正常
- python - 在 PyQt 中透明地获取退格事件
- python-3.x - 在 Python 中通过 selenium-chromedriver 提交表单时出现问题
- oracle - Oracle - 根据组间距创建组
- querydsl - 在 QueryDsl 中编写条件查询