0Pricing
Swift Academy · Урок

Акторы и изоляция данных, nonisolated

Изучите изоляцию акторов: состояние защищено внутри actor , доступ между акторами требует await , а члены nonisolated обходят изоляцию, если они чистые или статические.

«Акторы и изоляция данных, nonisolated» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.

Что предоставляют акторы

Актор защищает своё изменяемое состояние. Только одна задача одновременно обращается к изолированному состоянию; внешние вызывающие объекты должны использовать await для его методов.

  • Изоляция означает отсутствие гонок данных
  • Вызовы между акторами являются асинхронными
  • nonisolated используется для чистых или статических членов

Основы акторов

Внутри актора доступ осуществляется напрямую. Извне необходимо использовать await и для чтения, и для записи изолированного состояния.

actor Counter {
    private var value: Int = 0   // isolated state

    func increment() { value += 1 }      // isolated method (async to outsiders)
    func get() -> Int { value }          // read isolated state
}

let c = Counter()
Task {
    await c.increment()
    print(await c.get())  // 1
}

Гарантия последовательного доступа

Даже если несколько задач вызывают методы одновременно, актор последовательно обрабатывает доступ к своему состоянию, предотвращая гонки.

actor BankAccount {
    private var balance: Int = 0
    func deposit(_ amount: Int) { balance += amount }
    func withdraw(_ amount: Int) -> Bool {
        if balance >= amount { balance -= amount; return true }
        return false
    }
    func current() -> Int { balance }
}

let acc = BankAccount()
Task {
    async let a = acc.deposit(50)
    async let b = acc.withdraw(20)
    _ = await (a, b)                 // operations are serialized inside the actor
    print(await acc.current())       // deterministic balance
}

API nonisolated

Помечайте члены как nonisolated, если они являются чистыми или статическими, чтобы вызывающим объектам не требовалось использовать await. Такие члены не должны обращаться к изолированному состоянию.

actor Clock {
    private var ticks: Int = 0
    func tick() { ticks += 1 }
    func read() -> Int { ticks }

    // Nonisolated: safe without awaiting (pure computation / constant)
    nonisolated static let format = "HH:mm:ss"

    nonisolated func describeFormat() -> String {
        // Cannot touch isolated state here; this is pure
        return "Format: " + Self.format
    }
}

let cl = Clock()
Task {
    await cl.tick()
    print(await cl.read())           // 1
    // Nonisolated members don't require await:
    print(Clock.format)              // "HH:mm:ss"
    print(cl.describeFormat())       // sync call
}

Учитывайте повторный вход

Акторы могут быть реентерабельными: после await внутри метода актора могут выполняться другие сообщения. Поддерживайте инварианты в корректном состоянии между точками await.

actor Logger {
    private var lines: [String] = []
    func log(_ s: String) async {
        lines.append(s)
        // Simulate an await point; actor may process other messages here (reentrant)
        try? await Task.sleep(nanoseconds: 10_000_000)
        lines.append("done")
    }
    func snapshot() -> [String] { lines }
}

let logger = Logger()
Task {
    async let a = logger.log("A")
    async let b = logger.log("B")
    _ = await (a, b)
    print(await logger.snapshot())   // order shows possible interleaving
}

Рекомендации

Рекомендации:

  • Предоставляйте небольшие асинхронные методы; избегайте длительных критических секций.
  • Используйте nonisolated для констант и чистых вспомогательных функций.
  • Не храните общее изменяемое состояние, не являющееся Sendable, вне акторов — далее Вы узнаете о Sendable.

Требование изоляции актора

Быстрая проверка: как читать или изменять состояние актора извне?

Итоги

Итоги: акторы изолируют изменяемое состояние; для внешнего доступа требуется await. Используйте nonisolated для чистых или статических членов и проектируйте короткие асинхронные методы, чтобы безопасно работать с повторным входом.

Часто задаваемые вопросы

Урок «Акторы и изоляция данных, nonisolated» бесплатный?

Да — полный текст урока «Акторы и изоляция данных, nonisolated» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.

Чему я научусь в уроке «Акторы и изоляция данных, nonisolated»?

Изучите изоляцию акторов: состояние защищено внутри actor , доступ между акторами требует await , а члены nonisolated обходят изоляцию, если они чистые или статические. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.

Сколько времени занимает урок «Акторы и изоляция данных, nonisolated»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. TaskGroup для параллельного выполнения
  2. Акторы и изоляция данных, nonisolated
  3. Sendable и проверка потокобезопасности
← Назад к Swift Academy