Как передать данные между 2-мя отдалёнными VC?

Для передачи данных между двумя отдаленными ViewController в Swift есть несколько способов. Вот некоторые из них:

1. Использование делегирования (Delegation):

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

   protocol DataDelegate {
       func sendData(data: String)
   }

Затем вы должны добавить свойство делегата в ваш первый ViewController.

   class FirstViewController: UIViewController {
       var delegate: DataDelegate?
       
       // ...
   }

Второй ViewController должен реализовать протокол DataDelegate.

   class SecondViewController: UIViewController, DataDelegate {
       // ...
       
       func sendData(data: String) {
           // Обработка данных
       }
   }

Когда у вас будет экземпляр первого ViewController, вы можете назначить делегатом экземпляр второго ViewController.

   let firstVC = FirstViewController()
   let secondVC = SecondViewController()
   firstVC.delegate = secondVC

Теперь, когда у вас есть связь между двумя ViewController, вы можете вызывать метод sendData у делегата (в первом ViewController), чтобы передать данные во второй ViewController.

   delegate?.sendData(data: "Hello, World!")

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

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

   class FirstViewController: UIViewController {
       var completionHandler: ((String) -> Void)?
       
       // ...
   }

Затем вы можете назначить вашему замыканию обработчик во втором ViewController, передав его вместе с данными.

   class SecondViewController: UIViewController {
       // ...
       
       func sendDataToFirstViewController() {
           let firstVC = FirstViewController()
           
           firstVC.completionHandler = { data in
               // Обработка данных
           }
           
           firstVC.completionHandler?("Hello, World!")
       }
   }

Здесь мы вызываем замыкание, передавая ему данные "Hello, World!".

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

   completionHandler?("Hello, World!")

3. Использование NotificationCenter:

NotificationCenter позволяет отправлять уведомления о событиях в вашем приложении. Чтобы использовать NotificationCenter для передачи данных между двумя ViewController, вы должны определить уникальный идентификатор уведомления (notification identifier).

   extension Notification.Name {
       static let dataNotification = Notification.Name("DataNotification")
   }

Затем вы можете отправить уведомление с данными из первого ViewController.

   class FirstViewController: UIViewController {
       func sendDataToSecondViewController() {
           let data = "Hello, World!"
           
           NotificationCenter.default.post(name: .dataNotification, object: data)
       }
   }

Во втором ViewController вы можете добавить слушатель на уведомление и обработать данные.

   class SecondViewController: UIViewController {
       override func viewDidLoad() {
           super.viewDidLoad()
           
           NotificationCenter.default.addObserver(self, selector: #selector(handleData(notification:)), name: .dataNotification, object: nil)
       }
       
       @objc func handleData(notification: Notification) {
           if let data = notification.object as? String {
               // Обработка данных
           }
       }
   }

Не забудьте удалить слушателя уведомления во втором ViewController при необходимости:

   deinit {
       NotificationCenter.default.removeObserver(self)
   }

Это некоторые способы передачи данных между двумя отдаленными ViewController в Swift. Какой способ использовать, зависит от контекста вашего приложения и требований проекта.