Ответ
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 свойствам или к вычисляемым свойствам, не имеющим резервного хранилища.