← Назад к вопросам

Что такое модификатор isolated?

1.0 Junior🔥 12 комментариев
#Язык Swift

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое модификатор isolated в Swift?

Модификатор isolated — это ключевое слово в Swift, появившееся вместе с акторами (Actor) в рамках поддержки конкурентности (Concurrency), которое позволяет "временно выходить" из изолированной области актора для выполнения кода на той же изоляции, что и вызывающий код.

Основная проблема, которую решает isolated

Акторы по умолчанию защищают свои внутренние данные от гонок данных (data races), требуя использования await для доступа к их свойствам и методам извне. Однако иногда нужно передать изоляцию (isolation) вызывающей стороне, чтобы выполнить несколько операций подряд без многократных await и переключений контекста.

Как работает isolated

Когда вы помечаете параметр функции как isolated, вы говорите: "эта функция должна выполняться на изоляции переданного актора". Внутри такой функции вы можете напрямую обращаться к isolated-данным без await.

Пример без isolated

actor BankAccount {
    private var balance: Double = 1000
    
    func deduct(amount: Double) async {
        // Проверка и изменение требуют await извне
        if amount <= balance {
            balance -= amount
        }
    }
    
    func currentBalance() async -> Double {
        return balance
    }
}

// Использование - два await для двух операций
let account = BankAccount()
let balance = await account.currentBalance()
await account.deduct(amount: 200)

Пример с isolated

actor BankAccount {
    private var balance: Double = 1000
    
    func safeDeduction(amount: Double, from account: isolated BankAccount) {
        // Теперь мы внутри изоляции 'account' 
        // и можем напрямую обращаться к его свойствам
        if amount <= account.balance {
            account.balance -= amount
        }
    }
    
    func performTransfer(amount: Double, to recipient: BankAccount) async {
        // Вызываем isolated-функцию, передавая self как isolated-параметр
        safeDeduction(amount: amount, from: self)
        // Для recipient все равно нужен await
        await recipient.deposit(amount: amount)
    }
}

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

  1. Передача изоляции — функция получает изоляцию от переданного актора
  2. Только для параметров акторного типа — можно применять только к параметрам типа actor
  3. Непосредственный доступ — внутри функции можно напрямую обращаться к свойствам и методам актора
  4. Одно изоляционное требование — функция может иметь только один isolated-параметр

Практическое применение

// Функция, которая может работать на изоляции любого актора
func audit<T: Actor>(account: isolated T, auditor: Auditor) -> AuditReport {
    // Прямой доступ к состоянию актора
    let state = account.getInternalState()
    return auditor.generateReport(for: state)
}

// Использование в расширении актора
extension BankAccount {
    func batchOperations(using processor: isolated BankAccount) {
        // Множественные операции без переключений контекста
        processor.balance -= 100
        processor.balance *= 1.05
        processor.lastTransaction = Date()
    }
}

Ограничения и нюансы

  • Нельзя вызывать из синхронного кодаisolated
  • Один isolated-параметр на функцию — иначе неясно, чью изоляцию использовать
  • Требует акторного типа — не работает с обычными классами или структурами
  • Часто используется в комбинации с nonisolated — для создания гибких API

Вывод

Модификатор isolated — это мощный инструмент для оптимизации конкурентного кода, который позволяет избегать лишних await при выполнении последовательных операций с актором. Он особенно полезен при:

  • Реализации паттернов проектирования для акторов
  • Создании вспомогательных функций, работающих с состоянием актора
  • Оптимизации производительности при множественных операциях

Этот модификатор демонстрирует зрелость модели акторов в Swift, предоставляя детальный контроль над изоляцией при сохранении безопасности от гонок данных.