Прежде чем ответить на вопрос, вы должны лучше понять шаблон проектирования делегирования:
Позвольте мне начать с вопроса:
По умолчанию TableView выглядит так:
Как UITableView знает, сколько ячеек представить? что подарить в каждую клетку?
- Сам по себе, он не знает.
- Он просит другой класс сообщить его о количестве ячеек и о том, какую ячейку вернуть (какие cellimage, celltitle, cellubtitle и т. Обычно вы видите tableView (делегирующий класс) внутри ViewController (делегирующий класс)
- Эта концепция, когда один класс задает другой, называется делегированием!
Теперь, когда вы знаете, что такое делегация, чтобы ответить на актуальный вопрос ФП:
Это в основном ОГРОМНЫЙ вопрос семантических различий.
Если вам нужно использовать (а не создавать собственный протокол) делегатов и источники данных фонда, то это действительно не имеет значения для вас. Однако, если вы намереваетесь писать собственные протоколы, то понимание их поможет вам лучше написать (и с более важным чтением, рефрактором) код.
С точки зрения разработчика, они оба имеют дело с взаимодействием между классом делегата ing и классом делегата.
Источник данных
Источник данных практически идентичен делегату. Разница в
отношения с делегирующим объектом. Вместо того, чтобы
делегированное управление пользовательским интерфейсом, источник данных делегирован
контроль данных. Делегирующий объект, обычно объект вида, такой
как табличное представление, содержит ссылку на свой источник данных и иногда
запрашивает данные для отображения. Источник данных, как
делегат, должен принять протокол и реализовать как минимум
методы этого протокола. Источники данных отвечают за управление
память объектов модели, которые они передают в делегирующее представление.
С точки зрения непрофессионала:
DataSource в основном имеет дело с чем и обычно делает это при инициализации .
Делегат имеет дело главным образом с как и передает вам некоторые параметры, чтобы дать определенное поведение, например, если пользователь нажал на это ... что должно произойти? если они сильно ударили ... что должно произойти?
В качестве примера для tableView:
DataSource
Что у него внутри? Какую клетку я представляю? cellForRowAtIndexPath
.
Как называется раздел? titleForHeaderInSection
Сколько у них клеток? numberOfRowsInSection
И поэтому вы обычно возвращаете значений. Для делегатов чаще встречается тип void
.
Методы источника данных
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell // return a cell ie UITableViewCell
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int // return a number ie an Int
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? // return the title ie a String
Методы делегирования
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
func tableView(tableView: UITableView, willBeginEditingRowAtIndexPath indexPath: NSIndexPath)
func tableView(tableView: UITableView, willBeginEditingRowAtIndexPath indexPath: NSIndexPath)
Я, очевидно, выбрал выборочно, поскольку некоторые методы источника данных не возвращаются, а некоторые методы делегата возвращают
Делегирование
Что я должен делать / какую «форму поведения» я должен использовать после завершения отображения нижнего колонтитула, вы хотите, чтобы я выдал предупреждение? didEndDisplayingFooterView
У меня будет accessoryType, который дает клетке некоторые дополнительные функции? accessoryTypeForRowWithIndexPath