Swift: Слабая ссылка на функцию закрытия?
В Swift я сейчас сталкиваюсь с проблемой, когда мне нужно часто переносить functions
в closures
чтобы предотвратить циклы сильных ссылок при передаче функции класса в качестве параметра закрытия. Например, в сценарии ниже:
class A {
var foo: () -> Void
}
class B {
private let a: A
init() {
self.a = A()
a.foo = { [weak self] in self?.foo() } // <- Can this be simplified, while still avoiding strong reference cycles?
}
private func foo() {}
}
Всегда печатать { [weak self] in self?.myFunc() }
нехорошо, так как это открывает дверь людям, случайно вводящим утечки памяти, поскольку они забыли обернуть myFunc
в закрытии. Есть ли более простой / надежный способ добиться подобного поведения?
-- Редактировать
Если более простого способа не существует, я, скорее всего, открою запрос функции @ Apple для синтаксиса, который выглядит примерно так:
init() {
self.a = A()
a.foo = weak foo
}
где a.foo = weak foo
эквивалентно a.foo = { [weak self] in self?.foo() }
Или при работе с функциями, которые не принадлежат self
:
let b = B()
let a = A()
a.foo = weakb.foo
где a.foo = weakb.foo
эквивалентно a.foo = { [weakb] in b?.foo() }
Примечание: я не предлагаю сделать сами замыкания слабо привязанными. Я просто предлагаю этоweakb.foo
компилируется идентично { [weakb] in b?.foo() }