Я пытаюсь переопределить метод экземпляра из расширения протокола, и у меня проблемы.Как переопределить метод экземпляра из расширения протокола в Swift?
Для контекста я создаю приложение iOS с множеством различных UICollectionView. Эти представления получают данные из разных баз данных (требующие разных функций обратного вызова) и имеют очень разные макеты. Поскольку любая комбинация (база данных, макет) возможна, трудно создать хорошую иерархию классов ООП без массивного дублирования кода.
У меня возникла идея поместить функции макета (главным образом те, которые определены в протоколе UICollectionViewDelegateFlowLayout) в расширения протокола, поэтому я могу украсить данный подкласс UICollectionView протоколом, который расширен для реализации всех соответствующих функций макета, но я имея трудное время. Суть проблемы содержится в приведенном ниже коде.
class Base {
func speak(){
print("Base")
}
}
class SubA: Base, ProtocolA {}
class SubB: Base, MyProtocolB {}
protocol MyProtocolA{
func speak()
}
protocol MyProtocolB{
func speak()
}
extension MyProtocolA{
func speak(){
print("A")
}
}
extension MyProtocolA{
func speak(){
print("B")
}
}
let suba = SubA()
suba.speak() // prints "Base", I want it to print "A"
let subb = SubB()
subb.speak() // prints "Base", I want it to print "B"
Мысли?
«У меня возникла идея поместить функции макета (в основном те, которые определены в протоколе UICollectionViewDelegateFlowLayout) в расширения протокола« Забудьте эту идею. Objective-C никогда не вызовет реализацию из расширения протокола, поскольку Objective-C не может _see_ расширять протокол. Это функция Swift. – matt
@matt Этот вопрос не о Obj-C, хотя, не так ли? –
@TimVermeulen Да, это так. Речь идет о методах делегирования Objective-C в расширениях протокола Swift. – matt