Вы не должны использовать «расширение» для реализации функций протокола, вы должны использовать его для расширения вашего протокола, то есть добавления новых функций.Обычно вы расширяете свой собственный протокол с некоторыми перегрузками вспомогательных методов и реализуете их в терминах методов в протоколе, чтобы каждый класс, реализующий тот же протокол, мог избежать их реализации (в то время как клиенты получают выгоду от перегрузок).
Сначалавсего, что вам нужно, чтобы иметь фактические реализации вашего протокола:
class ApiProtocolForTests: ApiProtocol {
func stubMePlease() -> String {
return "fake hello world in test"
}
}
class ApiProtocolForRealz: ApiProtocol {
func stubMePlease() -> String {
return "hello world in real life"
}
}
Затем в MyUIView вместо наследования / реализации ApiProtocol, который концептуально не имеет смысла, вы должны передать его в конструкторы инициализации, например:
class MyUIView: UIView {
let api: ApiProtocol
override init(frame: CGRect, api: ApiProtocol) {
super.init(frame: frame)
self.api = api
foo()
}
...
В тестах вы создали бы MyUIView, предоставив ему версию протокола ApiProtocolForTests: myview = MyUIView(frame: frame, api: ApiProtocolForTests())
Это также известно как "внедрение" зависимости"ApiProtocol".