У меня есть довольно большое приложение, которое имеет множество видов коллекций. Большинство представлений коллекции имеют одинаковые реализации для источника данных и делегата Layout Flow (те же размеры, поля и т. Д.). Я пытаюсь создать единый протокол, который предоставляет стандартные реализации UICollectionViewDataSource и UICollectionViewDelegateFlowLayout. Вот мой код.Расширение UICollectionViewDataSource Protocol для добавления реализаций по умолчанию
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
}
Проблема заключается в том, что компилятор жалуется, что MyViewController не соответствует UICollectionViewDataSource. Это не должно быть так, потому что я четко говорю, что добавьте реализации по умолчанию, если тип TiledCollectionView.
Может ли кто-нибудь помочь?
Это похоже на хороший образец для добавления декораторов, например, в Python или Java. Продолжайте добавлять протоколы, которые определяют конкретное поведение, и один вызов метода (useProtocolFor ....) могут добавить это поведение. – suparngp
'@ suparngp' Не все. Если вы объявляете переменную в протоколе ('var handler: CollectionViewProtocolHandler!') - вы не можете реализовать ее в расширении, поэтому вам придется вручную добавить ее в свой класс. По крайней мере, вы не можете построить свой проект без него. Было бы неплохо, если Apple добавит объявление блока в протокол, когда вы наследуете его, как в Ruby, - поэтому вы можете увидеть там всю расширенную переменную и функции и иметь возможность переопределять их. – katleta3000