> Что такое side table в iOS и какую проблему она решает? (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Doubletapp

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Side table - это вспомогательная структура данных (обычно словарь или массив), которая хранит дополнительные данные отдельно от основной модели. Она решает проблему избыточности и связанности: позволяет не дублировать информацию в каждом объекте, а хранить её в одном месте и обращаться по ключу. Это упрощает обновление данных и уменьшает риск рассинхронизации.

Подробное объяснение

Side table часто используется в iOS, когда основная модель данных не должна содержать все поля напрямую. Например, у вас есть список пользователей, и для каждого нужно хранить временное состояние (выбран ли он, загружена ли аватарка). Вместо того чтобы добавлять эти поля в саму модель User, вы создаёте отдельный словарь [UserID: SelectionState].

Проблема, которую решает side table: разделение постоянных данных (которые приходят с сервера) и временного UI-состояния. Если добавить временные поля в модель, то:

  • модель становится "грязной" и её сложно сравнивать с серверной версией;
  • при обновлении данных с сервера временные поля могут затираться;
  • нарушается принцип единственной ответственности.

Side table также полезна для кэширования вычислений (например, высоты ячейки по тексту) или для хранения зависимостей между объектами без изменения самих объектов.

На практике

В UIKit side table часто используется в связке с UITableView или UICollectionView, когда нужно хранить состояние ячеек (выбрана, раскрыта, загружена). Также она встречается в архитектурах типа MVVM, где view model держит отдельный словарь состояний для каждой модели.

Пример из реальной задачи: у вас есть список чатов, и для каждого чата нужно показывать, читал ли пользователь последнее сообщение. Вместо поля isRead в модели Chat вы храните [ChatID: Bool] в презентере или view model. Это позволяет не менять модель при каждом действии пользователя и легко сбрасывать состояние при выходе из экрана.

Пример кода

SWIFT
struct Chat {
let id: String
let title: String
let lastMessage: String
}
final class ChatListViewModel {
// side table для временного состояния
private var readState: [String: Bool] = [:]
func markAsRead(chatID: String) {
readState[chatID] = true
}
func isRead(chatID: String) -> Bool {
return readState[chatID] ?? false
}
}

Как отвечать на собеседовании

Начните с определения: side table - это отдельное хранилище данных, связанных с основными объектами по ключу. Затем объясните проблему: избегаем загрязнения модели временными или производными данными. Приведите пример из UIKit - состояние ячеек таблицы. Если спросят про альтернативы, упомяните, что можно использовать NSMapTable для слабых ссылок или просто вычисляемые свойства, если данные можно получить из других источников.

Что проверяет интервьюер

Интервьюер проверяет, понимаете ли вы разницу между постоянными данными модели и временным состоянием. Также важно, что вы умеете обосновать выбор структуры данных (словарь по ID) и видите границы применения - когда side table оправдана, а когда лучше добавить поле в модель. Это показатель архитектурного мышления на уровне junior.

Типичные ошибки

  • Путают side table с кэшем или с базой данных - это не одно и то же.
  • Предлагают хранить состояние прямо в модели, не объясняя последствий.
  • Не упоминают проблему синхронизации при обновлении данных с сервера.
  • Используют side table там, где достаточно вычисляемого свойства - это усложняет код без необходимости.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью