Акторы и изоляция данных, 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 — локальная установка не требуется.
Все уроки этого курса
- TaskGroup для параллельного выполнения
- Акторы и изоляция данных, nonisolated
- Sendable и проверка потокобезопасности