В 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 = weak b.foo
, где a.foo = weak b.foo
эквивалентно a.foo = { [weak b] in b?.foo() }
Примечание: я не предлагаю делать сами затворы слабо ссылочными. Я просто предлагаю, чтобы weak b.foo
был скомпилирован идентично { [weak b] in b?.foo() }