Creating Property Wrappers in Swift

From the Swift cheat sheet · Property Wrappers · verified Jul 2026

Creating Property Wrappers

Custom property wrapper implementation

swift
// Basic property wrapper
@propertyWrapper
struct Capitalized {
    private var value = ""

    var wrappedValue: String {
        get { value }
        set { value = newValue.capitalized }
    }

    init(wrappedValue: String) {
        self.wrappedValue = wrappedValue
    }
}

struct User {
    @Capitalized var firstName: String
    @Capitalized var lastName: String
}

var user = User(firstName: "john", lastName: "doe")
print(user.firstName)  // "John"

// Property wrapper with parameters
@propertyWrapper
struct Clamped<T: Comparable> {
    var value: T
    let min: T
    let max: T

    var wrappedValue: T {
        get { value }
        set { value = Swift.min(Swift.max(newValue, min), max) }
    }

    init(wrappedValue: T, min: T, max: T) {
        self.min = min
        self.max = max
        self.value = Swift.min(Swift.max(wrappedValue, min), max)
    }
}
💡 Property wrappers encapsulate repetitive property logic
⚡ Use $ to access the projected value of a property wrapper
📌 SwiftUI heavily uses property wrappers (@State, @Binding, etc.)
🟢 Property wrappers can have init parameters for configuration
Back to the full Swift cheat sheet