norlin
@norlin

Как добавить один и тот же метод нескольким классам сразу?

Мне нужно добавить один и тот же метод сразу нескольким классам:
class FilterableTable: UITableViewController { ... }
class FilterableCollection: UICollectionViewController { ... }

extension FilterableTable, FilterableCollection { // я знаю, что эта строка некорректна
  func filterItems(){ print('filtered!') }
}

var myTable = FilterableTable()
myTable.filterItems()

var myCollection = FilterableCollection()
myCollection.filterItems()

Экстеншен, насколько я знаю, нельзя применить сразу к нескольким классам.
Протокол позволяет лишь определить сигнатуры методов, но не сами методы.

Есть вариант с созданием протокола и затем экстеншена к нему, с телом метода. Вариант, вроде бы, корректный, но XCode на нём постоянно крашится.

Самый правильный вариант был бы через наследование, но что-то не могу сообразить, как это сделать, с учётом того, что в Swift нет наследования от нескольких классов.

Буду благодарен за помощь!
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
norlin
@norlin Автор вопроса
Наконец-то нашёл вариант, который выглядит наиболее правильным: банальное использование делегатов.
class FilterableTable: UITableViewController {
    var filterDelegate: FilterDelegate! 
    func viewDidLoad(){
        filterDelegate = Filter()
    }
}
class FilterableCollection: UICollectionViewController {
    var filterDelegate: FilterDelegate! 
    func viewDidLoad(){
        filterDelegate = Filter()
    }
}

protocol FilterDelegate {
    func filterItems()
}

class Filter: FilterDelegate {
    func filterItems() {
        print("Hooray!")
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Flanker_4
@Flanker_4
Вы не правильно сделали. Из тех историй, где микроскопом забивают гвозди. У Вас выходит что все UIViewController'ы будут обладать методом filterItems, о котором они вообще ничего не будут знать. Правильное решение

Объявить свой протокол
protocol <Name> {
   func filterItems()
}


Реализация для протокола
extension <Name>  {
   func filterItems(){ print('filtered!') }
}


Ну и дальше в классах стандартно указываете поддержку протокола

Из плохого, у Вас view controller занимается не тем чем должен заниматься
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы