What are property wrappers in Swift?
Answer
Property wrappers (Swift 5.1) add a layer of logic to property get/set operations. They're annotated with @propertyWrapper and used as property attribute. Simple clamping wrapper: @propertyWrapper struct Clamped<T: Comparable> { var wrappedValue: T { didSet { wrappedValue = min(max(wrappedValue, minValue), maxValue) } } let minValue: T; let maxValue: T init(wrappedValue: T, min: T, max: T) { self.minValue = min; self.maxValue = max self.wrappedValue = wrappedValue } } struct Player { @Clamped(min: 0, max: 100) var health = 100 } var player = Player() player.health = 150 // Clamped to 100 player.health = -10 // Clamped to 0. UserDefaults wrapper: @propertyWrapper struct UserDefault<T> { let key: String; let defaultValue: T var wrappedValue: T { get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue } set { UserDefaults.standard.set(newValue, forKey: key) } } } struct Settings { @UserDefault(key: "isDarkMode", defaultValue: false) static var isDarkMode: Bool } Settings.isDarkMode = true. projectedValue ($): expose additional value via $ prefix: @propertyWrapper struct Validated<T> { var wrappedValue: T private(set) var projectedValue: Bool = false // $isValid } @Validated var age: Int @State var count = 0 // $count is Binding<Int>. Built-in property wrappers: @State, @Binding, @Published, @StateObject, @ObservedObject, @EnvironmentObject, @Environment, @AppStorage, @SceneStorage, @Lazy, @atomic patterns. Property wrappers reduce boilerplate and are the mechanism behind SwiftUI's reactive state system.