> Что такое actor в Swift и для чего он нужен (iOS, Swift)

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

Компании: SimbirSoft, VK

Стек: iOS, Swift

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

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

Actor - это reference type в Swift, который защищает своё состояние от data races. Он гарантирует последовательный доступ к своим свойствам и методам через actor isolation, то есть код вне actor'а не может напрямую читать или изменять его mutable-состояние. Нужен для безопасной работы с общими данными в многопоточной среде, например, в iOS-приложениях при обращении к общим ресурсам из разных потоков.

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

Actor появился в Swift 5.5 вместе с async/await. По сути, это класс с встроенной синхронизацией. Основная идея - изолировать состояние: все свойства и методы actor'а по умолчанию являются actor-isolated, то есть доступны только изнутри самого actor'а или через await извне.

Компилятор сам добавляет необходимую синхронизацию, поэтому разработчику не нужно вручную использовать locks или очереди. Это снижает риск ошибок, связанных с гонками данных.

Ключевые особенности:

  • actor - это reference type
  • все его свойства и методы изолированы по умолчанию
  • доступ к изолированным членам извне требует await
  • actor может иметь nonisolated методы и свойства (например, let константы)
  • actor поддерживает наследование от других actor'ов и от NSObject (через @MainActor)

На практике

В iOS-разработке actor'ы удобно использовать для:

  • общего кэша или хранилища данных, к которому обращаются из разных потоков
  • сетевого слоя, где нужно сериализовать запросы
  • управления состоянием, которое обновляется из фоновых задач и UI

Пример: менеджер загрузки изображений, к которому обращаются из нескольких collection view одновременно. Без actor'а пришлось бы использовать DispatchQueue или NSLock. С actor'ом достаточно объявить класс как actor - и доступ к его состоянию станет безопасным.

Важно помнить, что actor не решает проблему deadlock'ов и не делает код автоматически быстрым - он лишь гарантирует корректность при конкурентном доступе.

Пример кода

SWIFT
actor ImageCache {
private var cache: [String: Data] = [:]
func image(for key: String) -> Data? {
return cache[key]
}
func store(_ data: Data, for key: String) {
cache[key] = data
}
}
// Использование
let cache = ImageCache()
Task {
let data = await cache.image(for: "avatar")
// ...
}

Также можно использовать nonisolated для неизменяемых данных:

SWIFT
actor UserService {
nonisolated let baseURL = "https://api.example.com"
private var users: [User] = []
func fetchUsers() async -> [User] {
// ...
}
}

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

Начни с простого определения: actor - это тип, который защищает состояние от гонок данных. Затем добавь, что это reference type с автоматической синхронизацией. Упомяни, что доступ к изолированным членам требует await. Приведи пример из практики - например, кэш или общий менеджер. Если спросят про отличия от class - скажи, что actor добавляет изоляцию на уровне компилятора, а не вручную. Не углубляйся в детали реализации, если не просят.

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

Интервьюер проверяет:

  • понимание проблемы data races и зачем нужна синхронизация
  • знание синтаксиса и ключевых особенностей actor'а
  • умение объяснить разницу между actor и class
  • понимание, когда actor уместен, а когда нет
  • базовое понимание async/await в связке с actor'ом

Для junior достаточно уверенно объяснить базовую концепцию и показать простой пример.

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

  • говорить, что actor - это struct (это reference type)
  • забывать про await при обращении к изолированным членам
  • пытаться использовать actor для неизменяемых данных без необходимости
  • утверждать, что actor полностью исключает все проблемы многопоточности (он не решает deadlock'и и не ускоряет код)
  • путать actor с @MainActor - это разные вещи, хотя @MainActor тоже использует механизм изоляции

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

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