Передача данных между VC обратно?

В iOS разработке, передача данных между UIViewController (VC) может осуществляться несколькими способами, и будем рассматривать два наиболее распространенных способа: использование делегатов и замыканий (closures).

1. Использование делегатов:

Делегат - это объект, который предоставляет возможность другому объекту сообщать о происходящих событиях и передавать данные. Для передачи данных обратно от одного VC к другому, мы можем определить протокол делегата в одном VC (назовем его SourceViewController), а затем сделать другой VC (назовем его DestinationViewController) делегатом такого протокола.

Код в SourceViewController будет выглядеть примерно так:

protocol DataDelegate: class {
    func didReceiveData(data: String)
}

class SourceViewController: UIViewController {
    weak var delegate: DataDelegate?

    // Функция, которая будет вызываться, чтобы передать данные обратно
    func sendData() {
        let data = "Hello, World!"
        delegate?.didReceiveData(data: data)
    }
    
    // ...
}

А код в DestinationViewController будет таким:

class DestinationViewController: UIViewController, DataDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let sourceVC = SourceViewController()
        sourceVC.delegate = self
    }

    // Реализация метода делегата для получения переданных данных
    func didReceiveData(data: String) {
        print(data) // "Hello, World!"
        // Делать что-то с данными здесь
    }
    
    // ...
}

Таким образом, DestinationViewController становится делегатом SourceViewController, и когда вызывается метод sendData() в SourceViewController, данные передаются обратно через метод делегата didReceiveData(data:) в DestinationViewController.

2. Использование замыканий:

Замыкания - это анонимные функции, которые могут сохранять и передавать код. Мы можем использовать замыкания для передачи данных обратно от одного VC к другому.

Код в SourceViewController будет выглядеть так:

class SourceViewController: UIViewController {
    var onDataReceived: ((String) -> Void)?

    // Функция, которая будет вызываться, чтобы передать данные обратно
    func sendData() {
        let data = "Hello, World!"
        onDataReceived?(data)
    }
    
    // ...
}

Код в DestinationViewController будет выглядеть примерно так:

class DestinationViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let sourceVC = SourceViewController()
        sourceVC.onDataReceived = { data in
            print(data) // "Hello, World!"
            // Делать что-то с данными здесь
        }
    }
    
    // ...
}

Теперь, когда вызывается метод sendData() в SourceViewController, переданные данные доступны через замыкание onDataReceived в DestinationViewController.

В обоих случаях, при передаче данных обратно, важно учитывать жизненный цикл VC и правильно устанавливать делегаты или замыкания, чтобы избежать утечки памяти.