📖 Scenario: Imagine you are building a simple app that needs to store and validate user input, like a username. You want to make sure the username is always trimmed of spaces and never empty. Doing this repeatedly in your code can be boring and error-prone.
🎯 Goal: You will create a property wrapper in Swift that automatically trims whitespace from a string and ensures it is not empty. This will help you avoid writing the same trimming and validation code every time you use a username property.
📋 What You'll Learn
Create a property wrapper called Trimmed that trims whitespace from a string
Create a struct called User with a property username using the @Trimmed wrapper
Initialize a User instance with a username containing spaces
Print the trimmed username to show the property wrapper works
💡 Why This Matters
🌍 Real World
Property wrappers are used in apps to simplify data validation, formatting, and storage, reducing repeated code and bugs.
💼 Career
Understanding property wrappers is important for Swift developers to write clean, reusable, and maintainable code in iOS and macOS projects.
Progress0 / 4 steps
1
Create the Trimmed property wrapper
Create a property wrapper called Trimmed that has a wrappedValue of type String. Initialize it with a string and trim whitespace from the start and end using trimmingCharacters(in: .whitespaces).
Swift
Hint
Use @propertyWrapper before the struct. Implement wrappedValue with get and set that trims whitespace.
2
Create the User struct with a @Trimmed username
Create a struct called User with a property username of type String that uses the @Trimmed property wrapper.
Swift
Hint
Define struct User with a property username using @Trimmed.
3
Initialize a User with a spaced username
Create a variable called user and initialize it with User(username: " swiftLearner ").
Swift
Hint
Create a variable user and assign User(username: " swiftLearner ")
4
Print the trimmed username
Write a print statement to display user.username.
Swift
Hint
Use print(user.username) to show the trimmed username.
Practice
(1/5)
1. What is the main reason property wrappers reduce boilerplate code in Swift?
easy
A. They replace functions with variables
B. They allow properties to be declared without types
C. They automatically generate UI elements for properties
D. They encapsulate common property logic to reuse it easily
Solution
Step 1: Understand property wrappers purpose
Property wrappers let you write common property behavior once and reuse it.
Step 2: Identify how boilerplate is reduced
By wrapping repeated code for properties, you avoid rewriting the same logic multiple times.
Final Answer:
They encapsulate common property logic to reuse it easily -> Option D
Hint: Remember: @propertyWrapper before struct/class [OK]
Common Mistakes:
Omitting the @ symbol before propertyWrapper
Using wrong attribute name like @wrapper
Missing var keyword for wrappedValue
3. Consider this Swift code using a property wrapper:
@propertyWrapper
struct Clamped {
var value: Int
var wrappedValue: Int {
get { value }
set { value = min(max(newValue, 0), 10) }
}
init(wrappedValue: Int) {
self.value = min(max(wrappedValue, 0), 10)
}
}
struct Score {
@Clamped var points: Int
}
var s = Score(points: 15)
print(s.points)
What is the output?
medium
A. 15
B. 0
C. 10
D. Compilation error
Solution
Step 1: Understand the Clamped property wrapper behavior
The wrapper limits values between 0 and 10 using min and max functions.
Step 2: Analyze initialization and print output
When Score is created with points = 15, the wrapper clamps it to 10. Printing s.points outputs 10.
Final Answer:
10 -> Option C
Quick Check:
Clamped value of 15 = 10 [OK]
Hint: Check how wrappedValue clamps values [OK]
Common Mistakes:
Assuming original value 15 is stored without clamping
Confusing wrappedValue with value property
Expecting runtime error for out-of-range value
4. This Swift code uses a property wrapper but causes a compile error. What is the mistake?
5. You want to create a property wrapper that logs every time a property changes without repeating logging code in every setter. Which approach best uses property wrappers to reduce boilerplate?
hard
A. Use a global function to log changes and call it in setters
B. Create a @Logger wrapper that prints old and new values inside wrappedValue's setter
C. Add print statements manually in every property setter
D. Override Swift's default setter behavior globally
Solution
Step 1: Identify how property wrappers reduce repeated code
Property wrappers let you write logging once inside the wrapper's setter.
Step 2: Compare options for logging property changes
Create a @Logger wrapper that prints old and new values inside wrappedValue's setter uses a @Logger wrapper to centralize logging, avoiding repeated code in each setter.
Final Answer:
Create a @Logger wrapper that prints old and new values inside wrappedValue's setter -> Option B
Quick Check:
Use property wrapper to centralize logging [OK]
Hint: Wrap logging in property wrapper setter once [OK]
Common Mistakes:
Manually adding print in every setter (repeats code)
Using global functions instead of wrappers
Trying to override Swift's default setter globally
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.