Что такое Actor в Swift?

«Что такое Actor в Swift?» — вопрос из категории Многопоточность, который задают на 29% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Actor — это тип данных, введенный в Swift для безопасной работы с изменяемым состоянием в конкурентном (многопоточном) коде. Он решает проблему гонок данных (data races).

Ключевой принцип: Actor изолирует свое изменяемое состояние, гарантируя, что только одна задача может получить к нему доступ в любой момент времени (взаимное исключение).

Основные особенности:

  • Изоляция состояния: Все свойства и методы по умолчанию изолированы.
  • await для доступа: Для вызова асинхронного метода или доступа к свойству actor'а извне необходимо использовать await. Это точка приостановки, где система решает, можно ли войти в actor.
  • Поддержка Sendable: Actor сам по себе является Sendable, что позволяет безопасно передавать его между потоками.

Пример: BankAccount Actor

actor BankAccount {
    private var balance: Double = 0

    func deposit(amount: Double) {
        // Внутри actor можно изменять состояние напрямую
        balance += amount
    }

    func withdraw(amount: Double) async -> Bool {
        // Проверка и изменение состояния атомарно
        if balance >= amount {
            balance -= amount
            return true
        }
        return false
    }
}

// Использование извне:
let account = BankAccount()
await account.deposit(amount: 100) // Требуется `await`
let success = await account.withdraw(amount: 50)

Почему это лучше мьютексов (locks)? Компилятор обеспечивает безопасность на этапе компиляции, предотвращая случайный доступ к состоянию без синхронизации.