Захват параметров через замыкание внутри замыкания - PullRequest
0 голосов
/ 06 июня 2019

В viewDidLoad я хочу, чтобы textView был слабо перехвачен закрытием, но я получаю сообщение об ошибке «тип выражения является неоднозначным без дополнительного контекста».

import UIKit

final class TableViewCell: UITableViewCell  {

    @IBOutlet weak var textView: UITextView!

}

final class TableViewManager: NSObject, UITableViewDataSource, UITextViewDelegate {

    typealias Action = (UITextView, IndexPath) -> Void

    var action: Action?

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCellID", for: indexPath) as! TableViewCell
        cell.textView.delegate = self
        cell.textView.tag = indexPath.row
        return cell
    }

    func textViewDidBeginEditing(_ textView: UITextView) {
        let indexPath = IndexPath(row: textView.tag, section: 0)
        action?(textView, indexPath)
    }
}

class ViewController: UIViewController {

    private let tableManager = TableViewManager()

    @IBOutlet weak var tableView: UITableView! {
        didSet {
            tableView.dataSource = tableManager
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableManager.action = { [weak self] textView, indexPath in
            asyncAfter(seconds: 0.5) { [weak textView] in // error here
                let isFirstResponder = textView?.isFirstResponder ?? false
                if isFirstResponder  {
                    self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
                }
            }
        }
    }
}

func asyncAfter(seconds: Double, block: @escaping () -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: block)
}

Если я удаляю [слабый textView], ошибка исчезает, но наверняка textView захватывается в замыкании?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...