Что такое Data Source в iOS (UIKit)?

«Что такое Data Source в iOS (UIKit)?» — вопрос из категории Паттерны, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Data Source — это паттерн проектирования и протокол в UIKit, который предоставляет данные и информацию о структуре для заполнения представлений, таких как UITableView или UICollectionView. Он отделяет логику данных от логики отображения.

Основные обязанности Data Source:

  • Определение количества секций и строк/ячеек.
  • Конфигурация и возврат ячеек для конкретных индексов.
  • (Опционально) Управление заголовками, нижними колонтитулами и редактированием таблицы.

Ключевые методы для UITableViewDataSource:

// Обязательные методы:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

// Опциональные методы:
func numberOfSections(in tableView: UITableView) -> Int
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?

Пример базовой реализации:

class MyDataSource: NSObject, UITableViewDataSource {
    private let items = ["Apple", "Banana", "Orange"]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CellID", for: indexPath)
        cell.textLabel?.text = items[indexPath.row]
        return cell
    }
}
// Использование:
// tableView.dataSource = MyDataSource()

Современные альтернативы:

  • UICollectionViewDiffableDataSource / UITableViewDiffableDataSource — используют снапшоты данных для автоматического анимированного обновления интерфейса.
  • Отдельный класс или extension ViewController — Data Source может быть вынесен в отдельную сущность для соблюдения принципа единственной ответственности (SRP).