Что такое Property Wrapper в Swift и приведите пример его использования.

«Что такое Property Wrapper в Swift и приведите пример его использования.» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Property Wrapper — это механизм Swift, который позволяет инкапсулировать общую логику управления доступом к свойству (get/set) в переиспользуемый тип. Объявляется с помощью атрибута @propertyWrapper.

Как это работает: Property Wrapper — это структура или класс, который должен реализовать как минимум свойство wrappedValue. При применении обертки к свойству, компилятор преобразует код, делегируя хранение и доступ к экземпляру обертки.

Практический пример: обертка для автоматического обрезания пробелов и капитализации строки:

@propertyWrapper
struct TrimmedAndCapitalized {
    private var value: String

    var wrappedValue: String {
        get { value }
        set { 
            // Логика внутри setter
            value = newValue.trimmingCharacters(in: .whitespacesAndNewlines).capitalized
        }
    }

    init(wrappedValue: String) {
        // Инициализация с применением логики
        self.value = wrappedValue.trimmingCharacters(in: .whitespacesAndNewlines).capitalized
    }
}

struct UserProfile {
    @TrimmedAndCapitalized var username: String
    @TrimmedAndCapitalized var city: String
}

var profile = UserProfile(username: "  john_doe  ", city: " new york ")
print(profile.username) // Выводит: "John_Doe"
print(profile.city)     // Выводит: "New York"

Распространенные кейсы применения:

  • Валидация: @Email, @PositiveNumber.
  • Связь с системой: @UserDefaultsBacked, @KeychainStored.
  • Реактивность: @Published в Combine/SwiftUI.
  • Трансформация данных: @Trimmed, @URLEncoded.

Важное ограничение: Property Wrappers нельзя применять к lazy, @IBOutlet, weak, unowned свойствам или к вычисляемым свойствам, не имеющим резервного хранилища.