В
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.