Property wrappers — это возможность Swift, которая позволяет тебе инкапсулировать переиспользуемую логику для сохранения и доступа к свойствам. Вместо того чтобы повторять одинаковый шаблонный код для разных свойств, ты определяешь логику один раз и применяешь её где угодно с помощью простой аннотации.
Чтобы создать property wrapper, тебе нужны:
@propertyWrapper на struct, class или enumwrappedValue, содержащее основную логикуprojectedValue — чтобы предоставить дополнительный функционал через префикс $Swift и SwiftUI предоставляют несколько встроенных property wrappers:
@State — управляет локальным состоянием view в SwiftUI@Published — инициирует обновления в Combine когда значение меняется@AppStorage — автоматически сохраняет значения в UserDefaultsВот простой кастомный wrapper, который ограничивает целое число в определённом диапазоне:
@propertyWrapper
struct Clamped {
private var value: Int
private let range: ClosedRange<Int>
var wrappedValue: Int {
get { value }
set { value = min(max(newValue, range.lowerBound), range.upperBound) }
}
init(wrappedValue: Int, _ range: ClosedRange<Int>) {
self.range = range
self.value = min(max(wrappedValue, range.lowerBound), range.upperBound)
}
}
struct Player {
@Clamped(0...100) var health: Int = 100
}
Property wrappers идеальны для:
Вычисляемое свойство wrappedValue — единственный обязательный компонент property wrapper'а, а projectedValue полностью опционален и не дает никакой функциональной пользы для базовых реализаций.
Новый — ещё не проверен сообществом
Вы