Объявить слабым во вложенном замыкании - PullRequest
0 голосов
/ 22 января 2019

В течение следующей 0,5 секундной задержки tableViewManager может быть освобожден. Я хочу убедиться, что textView является слабым при взаимодействии с ним внутри вложенного замыкания. Как бы я пошел по этому поводу?

tableViewManager.textViewDidBeginEditing = { [weak self] textView, indexPath in
    asyncAfter(seconds: 0.5) {
        let value = textView.tag // touched here
        self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    }
}

Редактировать : Пожалуйста, прекратите давать ответы о том, как сделать себя слабым. Этот вопрос не задает о себе. TextView. Teeeeexttt viiieeewww.

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Это невозможно. Теперь это было признано ошибкой .

0 голосов
/ 23 января 2019

Вы можете использовать обычный синтаксис:

tableViewManager.textViewDidBeginEditing = { [weak self] textView, indexPath in
    // textView is strong here
    asyncAfter(seconds: 0.5) { [weak textView] in
        // textView is weak here
        let value = textView?.tag // touched here
        self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    }
}

Отредактировано:

Попробуйте использовать контейнер, чтобы избежать этой ошибки компилятора:

class WeakLink<T: AnyObject> {
    weak var value: T?

    init(_ value: T) {
        self.value = value
    }
}

tableViewManager.textViewDidBeginEditing = { [weak self] textView, indexPath in
    let weakTextView = WeakLink(textView)
    asyncAfter(seconds: 0.5) {
        // textView is weak here
        let textView = weakTextView.value
        let value = textView?.tag // touched here
        self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    }
}
0 голосов
/ 22 января 2019

если вы поместите [слабое я] в верхнее закрытие, оно будет слабым для всех вложенных ... и затем рассмотрите безопасное развертывание, если вы не хотите, чтобы оно было необязательным в основном закрытии.

tableViewManager.textViewDidBeginEditing = { [weak self] textView, indexPath in
  guard let self = self else { return } // optional...
  asyncAfter(seconds: 0.5) {
     let value = textView.tag // touched here
     self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
  }
}

ОБНОВЛЕНИЕ:

Я думаю, что если tableViewManager будет освобожден, закрытие никогда не будет вызвано ... верно? поэтому не нужно беспокоиться о том, что textView не является обязательным. это параметр закрытия ... так что вы можете установить его только в объявлении закрытия.

ARC автоматически удалит замыкание, как только исчезнет ссылка на tableViewManager.

...