Хотя протоколы поддерживают конкретные реализации, использующие расширение, но это не соответствует концепции protocol
Протокол определяет схему методов, свойств и других
требования, которые удовлетворяют конкретной задаче или функциональности.
и этого следует избегать, насколько это возможно, пока вы не будете уверены, что это не будет overriden
.
Решение 1:
Если вы попали в упомянутую ситуацию, я бы предложил ввести посредника class
, который ничего не делает, кроме как соответствовать этому protocol
, а затем наследовать subClasses
от этого class
.
public class Intermediary: MyProtocol {}
public class MyFirstClass: Intermediary {
public func sayCheese() {
print("Cheese from 1")
super.sayCheese()
}
}
public class MySecondClass: MyFirstClass {
override init() {
super.init()
sayHi()
}
public func sayHi() {
print("Hi from 2")
super.sayHi()
}
public override func sayCheese() {
print("Said cheese from 2")
super.sayCheese()
}
}
Теперь создающий объект MySecondClass()
напечатает вывод ниже,
Hi from 2
Hi, I am protocol
Cheese from protocol
Решение 2:
Как уже упоминалось в другом вопросе , удалите метод sayCheese
из protocol
, чтобы объявление протокола было пустым, но sayCheese
останется в extension
и прервет рекурсивный звонки на sayCheese
, позволяющие вашему приложению не зависать.
public protocol MyProtocol {}