Добавить объявление

Class vs Actor в Swift: ключевые отличия

В Swift и классы, и actor используются для создания ссылочных типов, но с разными целями. Главное отличие - в потокобезопасности. Actor появились в Swift 5.5 как часть Concurrency.

Классы (class):


  • Не потокобезопасны: доступ к свойствам и методам из разных потоков может привести к гонкам данных.

  • Поддерживают наследование: можно создавать подклассы.

  • Используются для общего состояния: подходят для объектов, которые не требуют синхронизации.

Пример использования:


class Counter {
var value = 0

func increment() {
value += 1 // Опасность при вызове из разных потоков
}
}

Actor:


  • Потокобезопасны: Swift автоматически сериализует доступ к свойствам и методам (очередь задач).

  • Нет наследования: нельзя наследовать от actor.

  • Для изолированного состояния: идеальны для данных, которые изменяются из разных потоков.

Пример использования:


actor SafeCounter {
private var value = 0

func increment() {
value += 1 // Безопасно (автоматическая синхронизация)
}

func currentValue() -> Int {
return value
}
}

Пример работы с Actor:


let counter = SafeCounter()

Task {
await counter.increment()
let value = await counter.currentValue()
print(value) // 1
}

Важно:


  • Для вызова методов actor нужен await.

  • Свойства actor по умолчанию private.

Вывод:


  • Классы - для простых объектов без многопоточности.

  • Actor - для данных, изменяемых из разных потоков (счетчики, кеши, состояния).


Если нужно потокобезопасное решение - выбирайте actor. Если важна гибкость и наследование - class.
14.07.2025 8 399