Для вашего протокола требуется gettable и settable refreshControl
(который возвращает UIRefreshControl!
), но ваша реализация по умолчанию предоставляет только getter (и этот getter возвращает другой тип, UIRefreshControl
).Ваша реализация по умолчанию также возвращает различный UIRefreshControl
каждый раз, когда к нему обращаются, и изменяет collectionView
каждый раз, когда к нему обращаются.Думаю, это не то, что вы имеете в виду.
Как следует из заметок Вадиана, я думаю, что базовый класс - это то, что вам действительно нужно, если вы хотите автоматически изменить collectionView.refreshControl
.Соответствие протоколу никогда не должно вызывать неявных изменений в других свойствах, и в большинстве случаев это не может.Представьте, если PopularMovieVC
соответствует MovieDisplay
в расширении в другом модуле.В лучшем случае это приведет к путанице.
Соответствие протокола расширяет возможности использования типа, такие как добавление новых методов.Это ничего не меняет в самом типе.Если вы хотите что-то изменить в самом типе, вам нужно что-то вроде наследования или компоновки, а не соответствия протокола.
Если вы делаете это немного, я бы не стал делать это с протоколамисюда.Я бы просто создал такие расширения:
extension UIRefreshControl {
static func makeStandard(attachedTo collectionView: UICollectionView) -> UIRefreshControl {
let rc = UIRefreshControl()
rc.backgroundColor = .clear
rc.tintColor = .lightGray
if #available(iOS 10.0, *) {
collectionView.refreshControl = rc
} else {
// Fallback on earlier versions
collectionView.addSubview(rc)
}
return rc
}
}
extension UIActivityIndicatorView {
static func makeStandard() -> UIActivityIndicatorView {
return UIActivityIndicatorView(style: .gray)
}
}
Тогда ваш контроллер представления может выглядеть следующим образом:
class MyViewController: UIViewController {
private var refreshController: UIRefreshControl!
@IBOutlet var collectionView: UICollectionView!
let activityIndicator = UIActivityIndicatorView.makeStandard()
override func viewDidLoad() {
refreshController = .makeStandard(attachedTo: collectionView)
}
}
Нет необходимости в протоколах, и это позволяет вам обрабатывать несколько представлений коллекции вКонтроллер того же вида или любая другая необычная ситуация.Также становится понятнее, что вызов этого метода изменит представление коллекции.