Свифт: Слабо справочная функция как замыкание? - PullRequest
2 голосов
/ 14 апреля 2020

В 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() }

...