Mam dość dużą aplikację, która ma wiele widoków kolekcji. Większość widoku kolekcji ma te same implementacje dla źródła danych i Delegata układu przepływu (te same rozmiary, marginesy itp.). Próbuję utworzyć pojedynczy protokół, który zapewnia domyślne implementacje UICollectionViewDataSource i UICollectionViewDelegateFlowLayout. Oto mój kod.Rozszerzanie protokołu UICollectionViewDataSource w celu dodania domyślnych implementacji
protocol TiledCollectionView{}
extension UICollectionViewDataSource where Self: TiledCollectionView{
//default implementation of the 3 methods to load the data ...
}
extension UICollectionViewDelegateFlowLayout where Self: TiledCollectionView {
//default implementation for layout methods to set default margins etc...
}
class MyViewController: UIViewController, TiledCollectionView, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
// the rest of the required logic for view controller
// here I Don't implement any CollectionView methods since I have provided the default implementation already
}
Problemem jest to, że kompilator narzeka, że MyViewController nie odpowiada UICollectionViewDataSource. Nie powinno tak być, ponieważ wyraźnie mówię, że dodać domyślne implementacje, jeśli typem jest TiledCollectionView.
Czy ktoś może pomóc?
Wydaje się, że to dobry wzór do dodawania dekoratorów, takich jak te w Pythonie lub Javie. Kontynuuj dodawanie protokołów, które definiują określone zachowanie i pojedyncze wywołanie metody (useProtocolFor ....) mogą dodać to zachowanie. – suparngp
'@ suparngp' Nie wszystkie. Jeśli zadeklarujesz zmienną w protokole ('var handler: CollectionViewProtocolHandler!') - nie możesz jej zaimplementować w rozszerzeniu - musisz więc ręcznie dodać ją do swojej klasy. Przynajmniej nie możesz zbudować swojego projektu bez niego. Byłoby miło, gdyby Apple dodawał deklarację blokowania do protokołu, kiedy dziedziczysz go tak jak w Ruby - możesz więc zobaczyć tam wszystkie rozszerzone zmienne i funkcje i mieć opcję ich przesłonięcia. – katleta3000