A protocol
объявляет абстрактный интерфейс.Расширение протокола объявляет реализации по умолчанию.
Некоторые языки программирования делают это по-разному (например, Java с ключевым словом default
в interface
), но это было синтаксическое решение для Swift.
Причина, по которой перенос стандартных реализаций в расширение лучше в Swift, заключается в том, что расширение может иметь ограничения типа, поэтому у вас могут быть разные реализации по умолчанию для разных типов.
Например:
protocol ErrorDisplaying {
func showError(message: String)
}
extension ErrorDisplaying where Self: UIViewController {
func showError(message: String) {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
present(alert, animated: true, completion: nil)
}
}