Более современной альтернативой использованию делегата является использование замыкания. Например, допустим, вы хотите передать данные из SecondVC
обратно в FirstVC
:
class FirstVC: UIViewController {
private func presentSecondVC() {
let secondVC = SecondVC()
secondVC.dataChangedHandler = dataChanged(data:)
present(secondVC, animated: true)
}
private func dataChanged(data: SomeModel) {
// do stuff with data
}
}
В SecondVC
, вам нужна переменная для обработчика:
class SecondVC: UIViewController {
var dataChangedHandler: ((SomeModel) -> Void)?
private var data: SomeModel = ...
private func dataDidChange() {
dataChangedHandler?(data)
}
}
Вместо делегата вы используете dataChangedHandler
, закрытие для передачи данных туда и обратно. Вы можете легко расширить этот метод до трех контроллеров представления, передавая ссылку на dataChanged(data:)
.
Использование замыканий является кратким (вам даже не нужен протокол) и универсальным. Он также очень модульный, так как вам не нужно напрямую выставлять FirstVC
.