Мне нравится, как Swift позволяет вам определить метод в протоколе, а затем через расширение этого протокола реализовать этот метод. Однако, особенно в случаях, когда вы определяете протокол и расширение в одной области действия и с одинаковыми уровнями доступа, нужно ли вам в первую очередь определять метод в протоколе?
Рассмотрим этот код:
public protocol MyProtocol {
func addThese(a:Int, b:Int) -> Int
}
public extension MyProtocol {
func addThese(a:Int, b:Int) -> Int{
return a + b
}
}
Чем это отличается от этого?
public protocol MyProtocol {
}
public extension MyProtocol {
func addThese(a:Int, b:Int) -> Int{
return a + b
}
}
Примечание. Я специально спрашиваю о протоколе и расширении, определяемых вместе в одной области с одинаковыми уровнями доступа.
Если бы это было не так, т.е. расширение находится в другой области действия, чем протокол, — тогда, очевидно, только элементы в той же области, что и расширение, получат автоматическую реализацию. Это имеет смысл.
т. е. в модуле А:
public protocol MyProtocol {
func addThese(a:Int, b:Int) -> Int
}
В модуле Б
internal extension MyProtocol {
func addThese(a:Int, b:Int) -> Int{
return a + b
}
}
Все элементы в модуле B, которые реализуют MyProtocol
, автоматически получат реализацию для addThese
, тогда как элементы, которые реализуют MyProtocol
в другой области, по-прежнему должны явно удовлетворять протоколу.
Опять же, речь идет о совместном определении протокола и расширения. Нужно ли определять функцию в самом протоколе, или это просто считается хорошей практикой?