Ant*_*ony 7 closures function swift
在很多示例中,人们使用闭包将函数作为参数传递:
sum.getSumOf(array: [1,2,3]) { [weak self] sum in
self?.result = sum
print(self?.result as Any)
}
Run Code Online (Sandbox Code Playgroud)
我知道这是为了自行车问题。但是传递一个函数而不是一个闭包呢?如何使这个功能“弱”?
例如:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
class Sum {
func getSumOf(array:[Int], handler: ((Int)->Void)) {
//step 2
var sum: Int = 0
for value in array {
sum += value
}
handler(sum)
}
}
Run Code Online (Sandbox Code Playgroud)
首先,在你的例子中根本不需要weak
。没有保留循环,因为处理程序没有转义。它会立即执行并释放。weak
在没有保留循环的情况下,您不应该使用。
即使在转义的情况下,也可能并不总是存在一个保留循环,因为闭包最终可能会被释放。@escaping
但是,当有注释时,您只能通过文档来真正了解这一点。
也就是说,对于您的具体问题,在此示例中:
func doSum() {
sum.getSumOf(array: [1,2,3], handler: store(sum:))
}
Run Code Online (Sandbox Code Playgroud)
这会捕获self
(因为它是 的隐式参数store(sum:)
),并且不可能self
使用此语法进行弱化。在这种情况下没关系,因为没有保留循环,但是如果有,如果您选择以这种方式传递方法,则无法解决它。