← Назад к вопросам

Какие знаешь типы свойств?

1.3 Junior🔥 301 комментариев
#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы свойств в Swift

В Swift свойства делятся на несколько категорий, каждая из которых имеет свои особенности и варианты использования.

Основные категории свойств

1. Stored Properties (Хранимые свойства)

  • Сохраняют константные или переменные значения как часть экземпляра
  • Могут быть объявлены в классах и структурах
struct Person {
    var name: String // хранимое свойство-переменная
    let id: Int      // хранимое свойство-константа
}

2. Computed Properties (Вычисляемые свойства)

  • Не хранят значения, а предоставляют геттер и опционально сеттер для получения/установки значений
  • Доступны в классах, структурах и перечислениях
struct Rectangle {
    var width: Double
    var height: Double
    
    var area: Double { // вычисляемое свойство
        get {
            return width * height
        }
        set(newArea) {
            let ratio = width / height
            width = sqrt(newArea * ratio)
            height = sqrt(newArea / ratio)
        }
    }
}

Специальные типы свойств

3. Lazy Stored Properties (Ленивые хранимые свойства)

  • Инициализируются только при первом обращении
  • Должны быть объявлены как var
class DataManager {
    lazy var dataProcessor = DataProcessor() // создается только при обращении
    lazy var cachedData: [String] = {
        // сложная инициализация
        return self.loadDataFromDisk()
    }()
}

4. Property Observers (Наблюдатели свойств)

  • willSet - вызывается перед установкой значения
  • didSet - вызывается после установки значения
  • Доступны только для хранимых свойств
class TemperatureController {
    var currentTemperature: Double = 20.0 {
        willSet(newValue) {
            print("Температура изменится с \(currentTemperature) на \(newValue)")
        }
        didSet(oldValue) {
            print("Температура изменилась с \(oldValue) на \(currentTemperature)")
        }
    }
}

5. Type Properties (Свойства типа)

  • Принадлежат самому типу, а не его экземплярам
  • Используются для общих значений
  • Для классов могут быть вычисляемыми или хранимыми, для структур/перечислений - только вычисляемыми
struct MathConstants {
    static let pi = 3.14159
    static var version = "1.0"
}

class AppSettings {
    static let shared = AppSettings() // паттерн Singleton
    private init() {}
}

Модификаторы доступа и обертки

Property Wrappers (Обертки свойств)

  • Позволяют инкапсулировать общую логику работы со свойствами
@propertyWrapper
struct UserDefault<T> {
    let key: String
    let defaultValue: T
    
    var wrappedValue: T {
        get {
            return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
        }
        set {
            UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}

class Settings {
    @UserDefault(key: "darkMode", defaultValue: false)
    var isDarkModeEnabled: Bool
}

Особые случаи

6. Optional Properties (Опциональные свойства)

  • Могут иметь значение nil
  • Используются когда значение может отсутствовать
class Person {
    var middleName: String? // опциональное свойство
}

7. Weak и Unowned References (Слабые и бесхозные ссылки)

  • Решают проблему сильных ссылочных циклов
  • weak - становятся nil при освобождении объекта
  • unowned - предполагают, что объект всегда существует
class Customer {
    weak var creditCard: CreditCard? // слабая ссылка
}

class Department {
    unowned var manager: Manager // бесхозная ссылка
}

Практическое применение

Каждый тип свойств имеет свою нишу:

  • Хранимые свойства - для базового хранения данных
  • Вычисляемые свойства - для производных значений или валидации
  • Ленивые свойства - для оптимизации производительности
  • Наблюдатели - для реактивного программирования
  • Свойства типа - для общих конфигураций
  • Обертки свойств - для повторно используемой бизнес-логики

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

Какие знаешь типы свойств? | PrepBro