This app shows two texts. The first text uses the custom Highlight modifier to get padding, a yellow background, and rounded corners. The second text is normal.
iOS Swift
import SwiftUI
struct Highlight: ViewModifier {
func body(content: Content) -> some View {
content
.padding(10)
.background(Color.yellow)
.cornerRadius(8)
}
}
struct ContentView: View {
var body: some View {
VStack(spacing: 20) {
Text("Important Message")
.modifier(Highlight())
Text("Normal Text")
}
.padding()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
OutputSuccess
Important Notes
You can add parameters to your custom ViewModifier to make it flexible.
Use .modifier() to apply your custom modifier to any view.
Custom modifiers help keep your UI code clean and reusable.
Summary
Custom ViewModifiers let you bundle view styles and behaviors.
They make your UI code easier to read and reuse.
Apply them with .modifier() on any SwiftUI view.
Practice
(1/5)
1. What is the main purpose of creating a custom ViewModifier in SwiftUI?
easy
A. To reuse a set of view styles and behaviors easily
B. To create a new type of view from scratch
C. To handle user input events directly
D. To manage app navigation between screens
Solution
Step 1: Understand what a ViewModifier does
A ViewModifier bundles styling and behavior changes for views.
Step 2: Identify the main use
It helps reuse these styles easily across many views.
Final Answer:
To reuse a set of view styles and behaviors easily -> Option A
Quick Check:
Custom ViewModifiers = reuse styles [OK]
Hint: Think: reuse styles and behaviors with one modifier [OK]
Common Mistakes:
Confusing ViewModifier with creating new views
Thinking it handles navigation or input directly
Assuming it manages app state
2. Which of the following is the correct way to apply a custom ViewModifier named Highlight to a Text view?
easy
A. Text("Hello").modifier(Highlight())
B. Text("Hello").applyModifier(Highlight)
C. Text("Hello").useModifier(Highlight())
D. Text("Hello").addModifier(Highlight)
Solution
Step 1: Recall the correct method name
The method to apply a ViewModifier is .modifier().
Step 2: Check syntax for applying Highlight
It should be .modifier(Highlight()) with parentheses to create the modifier instance.
Final Answer:
Text("Hello").modifier(Highlight()) -> Option A
Quick Check:
Use .modifier() with instance [OK]
Hint: Remember: .modifier() takes an instance with () [OK]
Common Mistakes:
Using wrong method names like applyModifier or addModifier
A. Background modifier is not allowed inside ViewModifier
B. Two body functions cause a duplicate method error
C. Missing return keyword in body functions
D. Padding modifier must be applied before background
Solution
Step 1: Check method definitions in struct
There are two body(content:) methods defined, which is not allowed.
Step 2: Understand Swift rules for method overloading
Swift does not allow two methods with the same signature in one struct.
Final Answer:
Two body functions cause a duplicate method error -> Option B
Quick Check:
Duplicate body() methods = error [OK]
Hint: Only one body(content:) allowed per ViewModifier [OK]
Common Mistakes:
Trying to overload body method
Forgetting return keyword (not needed here)
Misunderstanding modifier order rules
5. You want to create a custom ViewModifier that adds a rounded border only if a Boolean highlight is true. Which of these implementations correctly applies the border conditionally?
hard
A. struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
if highlight {
content.border(Color.green, width: 2)
} else {
content
}
}
}
B. struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
content.border(highlight ? Color.green : Color.clear, width: 2)
}
}
C. struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
content
.border(Color.green, width: highlight ? 2 : 0)
}
}
D. struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
content
.border(Color.green, width: highlight)
}
}
Solution
Step 1: Eliminate compile errors
struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
if highlight {
content.border(Color.green, width: 2)
} else {
content
}
}
} returns different view types in if-else (compiler error). struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
content
.border(Color.green, width: highlight)
}
} passes Bool to width (CGFloat expected, type error).
Step 2: Compare remaining options
struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
content.border(highlight ? Color.green : Color.clear, width: 2)
}
} uses Color.clear with fixed width 2: invisible but expands frame (layout shift). struct ConditionalBorder: ViewModifier {
var highlight: Bool
func body(content: Content) -> some View {
content
.border(Color.green, width: highlight ? 2 : 0)
}
} uses conditional width 2/0: border only when true, no layout shift.
Final Answer:
content.border(Color.green, width: highlight ? 2 : 0) -> Option C