Можно ли наследоваться от actor в Swift?

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

Ответ

Да, наследование от actor поддерживается, но с важными ограничениями, связанными с изоляцией данных.

Основные правила:

  1. Подкласс также должен быть объявлен как actor
  2. Нельзя наследовать actor в class или struct
  3. Переопределяемые методы сохраняют изоляцию актора

Пример наследования:

actor BaseDatabaseActor {
    private var connectionCount = 0

    func connect() -> Int {
        connectionCount += 1
        return connectionCount
    }
}

actor LoggingDatabaseActor: BaseDatabaseActor {
    override func connect() -> Int {
        let count = await super.connect()  // await требуется для вызова родителя
        print("Connection #(count) established")
        return count
    }
}

Ограничения и рекомендации:

  • ❌ Нельзя сделать nonisolated override изолированного метода
  • ✅ Можно добавлять новые нефункциональные требования через протоколы
  • ⚠️ Наследование акторов усложняет поддержку — предпочтительнее композиция

Альтернатива — протоколы:

protocol DatabaseService {
    func connect() async -> Int
}

actor PostgresActor: DatabaseService { /* реализация */ }
actor MySQLActor: DatabaseService { /* реализация */ }

Используйте наследование акторов только когда действительно нужна общая базовая логика с состоянием.