Исторически в Objective-C свойства были реализованы через методы доступа (геттеры и сеттеры). В Swift введена специальная синтаксическая конструкция для computed properties, позволяющая легко создавать свойства, которые вычисляют своё значение «на лету». Это расширяет возможности инкапсуляции и выразительности кода типов.
Проблема: Не всегда удобно хранить результат как stored property, особенно если значение зависит от других свойств или постоянно изменяется. Использование методов-калькуляторов создаёт менее читаемый интерфейс типа, скрывая его природу.
Решение: Computed property определяется с помощью get и, при необходимости, set. При каждом обращении к такому свойству выполняется вычисление, а не чтение из памяти. Это позволяет, например, строить derived properties, которые автоматически синхронизированы с остальным состоянием объекта.
Пример кода:
struct Rectangle { var width: Double var height: Double var area: Double { get { return width * height } set { // Автоматическое обновление width под новое значение поля area (пример) width = sqrt(newValue / height) } } } var rect = Rectangle(width: 5, height: 2) print(rect.area) // 10 rect.area = 36 print(rect.width) // 3.0
Ключевые особенности:
Можно ли использовать willSet/didSet с computed property?
Нет, willSet и didSet применимы только к stored property. Для computed property эти наблюдатели не работают, так как нет автоматического хранения значения.
Может ли computed property обладать слабым или неявно развернутым типом?
Да, computed property может быть опциональным или неявно развернутым. Однако не имеет смысла делать такие свойства weak, так как они не содержат ссылку — только вычисление.
В каких случаях лучше использовать private set в computed property?
Модификатор доступа private(set) нельзя применить к computed свойству с get и set, только к stored property. Для computed свойства set может быть полностью приватным с помощью private set, но это реализуется неявно через доступность set-блока.
public var area: Double { private set { ... } get { ... } }
Гет computed property выполняет загрузку больших данных из сети каждый раз при доступе, приводя к фризам и перегрузке сети.
Плюсы:
Минусы:
Computed property вычисляет итоговое значение на основе других stored property с минимальными затратами, кеширование heavy-логики вынесено в отдельный механизм.
Плюсы:
Минусы: