Протокол разработан для предоставления интерфейса (набора методов и свойств), но оставляет реализацию для реализующих классов.
Когда у вас есть расширение для протокола, было принято решение иметьдля этого требуется реализация, чтобы не портить код внутри библиотеки или фреймворка.
Допустим, вы хотите расширить протокол UITableViewDataSource
с помощью метода, который вам нравится.Если Swift не требует реализации, что происходит со всеми UIViewControllers
в UIKit
, которые используют этот протокол?Технически вы можете вызвать метод, но затем получите ошибку, потому что метод не существует.
Swift решил эту проблему, потребовав реализации при расширении протокола.Таким образом, вы можете либо не реализовать его (используя реализацию по умолчанию), либо реализовать его (используя реализацию в своем классе).Это потому, что Apple хотела, чтобы Swift был максимально безопасным.
Редактировать: Вы не спрашивали, почему расширение требует реализации по умолчанию, вы спрашиваете, почему вы не можете просто установить по умолчаниюреализации в вашей protocol
, но лучше поместить ее в extension
.Я предполагаю, что это потому, что Swift любит сохранять согласованность, и поскольку они уже допускают реализации по умолчанию в расширениях протокола, им также может потребоваться наличие реализаций по умолчанию.
Помните, что нет ничего плохого в использованиинесколько расширений в одном файле, он даже предлагается в качестве предпочтительного способа разделения кода для лучшего обзора в Ray Wenderlich Swift Style Guide .