Bird
Raised Fist0
iOS Swiftmobile~20 mins

MVVM pattern in iOS Swift - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
MVVM Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Understanding MVVM Roles
In the MVVM pattern, which component is responsible for holding the UI logic and preparing data for display?
AController
BModel
CView
DViewModel
Attempts:
2 left
💡 Hint
Think about which part acts as a bridge between data and UI.
❓ ui_behavior
intermediate
2:00remaining
View Updates in MVVM
In an MVVM iOS app using SwiftUI, when the ViewModel updates a @Published property, what happens to the View?
AThe View automatically refreshes to reflect the new data.
BThe View requires manual refresh calls to update.
CThe Model triggers the View to update directly.
DThe ViewModel must notify the ViewController to update the View.
Attempts:
2 left
💡 Hint
Consider how SwiftUI reacts to changes in @Published properties.
❓ lifecycle
advanced
2:00remaining
ViewModel Lifecycle Management
Which of the following is the best practice to avoid memory leaks when a ViewModel holds a reference to a ViewController in MVVM on iOS?
AUse a strong reference to the ViewController in the ViewModel.
BDo not reference the ViewController at all in the ViewModel.
CUse a weak reference to the ViewController in the ViewModel.
DUse an unowned reference to the ViewController in the ViewModel.
Attempts:
2 left
💡 Hint
Think about how to prevent retain cycles between ViewModel and ViewController.
❓ navigation
advanced
2:00remaining
Navigation Handling in MVVM
In MVVM, where should navigation logic (like pushing a new screen) ideally be handled to keep the ViewModel testable and free of UIKit dependencies?
AInside the View, triggered by ViewModel signals.
BDirectly inside the ViewModel using UIKit calls.
CInside the Model layer.
DInside the AppDelegate.
Attempts:
2 left
💡 Hint
Consider separation of concerns and testability.
🔧 Debug
expert
3:00remaining
Debugging MVVM Data Binding Issue
Given this SwiftUI ViewModel code snippet, why does the View not update when 'count' changes? class CounterViewModel: ObservableObject { var count = 0 func increment() { count += 1 } } What is the cause?
AThe 'increment' method does not call objectWillChange.send(), so View is not notified.
BThe 'count' property is not marked with @Published, so changes are not observed.
CThe ViewModel does not conform to ObservableObject correctly.
DThe View is not observing the ViewModel instance.
Attempts:
2 left
💡 Hint
Check how SwiftUI detects changes in ViewModel properties.

Practice

(1/5)
1. What is the main role of the ViewModel in the MVVM pattern?
easy
A. To display the user interface elements
B. To hold data and business logic separate from the UI
C. To store raw data from the database only
D. To handle user input directly without any data processing

Solution

  1. Step 1: Understand MVVM roles

    The ViewModel acts as a middleman between the Model and the View, holding data and logic.
  2. Step 2: Identify ViewModel responsibility

    It keeps data and business logic separate from UI, so the View only handles display.
  3. Final Answer:

    To hold data and business logic separate from the UI -> Option B
  4. Quick Check:

    ViewModel = data + logic [OK]
Hint: ViewModel holds data and logic, not UI [OK]
Common Mistakes:
  • Confusing ViewModel with View
  • Thinking ViewModel handles UI rendering
  • Assuming ViewModel stores raw database data only
2. Which of the following is the correct way to declare a ViewModel property in Swift for binding to a SwiftUI View?
easy
A. @State var viewModel = MyViewModel()
B. @EnvironmentObject var viewModel = MyViewModel()
C. var viewModel = MyViewModel()
D. @ObservedObject var viewModel = MyViewModel()

Solution

  1. Step 1: Identify property wrapper for ViewModel

    In SwiftUI, @ObservedObject is used to observe ViewModel changes.
  2. Step 2: Check other options

    @State is for local state, @EnvironmentObject requires external injection, plain var lacks observation.
  3. Final Answer:

    @ObservedObject var viewModel = MyViewModel() -> Option D
  4. Quick Check:

    ViewModel binding uses @ObservedObject [OK]
Hint: Use @ObservedObject for ViewModel in SwiftUI [OK]
Common Mistakes:
  • Using @State for ViewModel instead of @ObservedObject
  • Forgetting to mark ViewModel as ObservableObject
  • Trying to instantiate ViewModel inside @EnvironmentObject
3. Given the following SwiftUI code snippet, what will be displayed when the button is tapped once?
class CounterViewModel: ObservableObject {
  @Published var count = 0
  func increment() { count += 1 }
}

struct ContentView: View {
  @ObservedObject var viewModel = CounterViewModel()
  var body: some View {
    VStack {
      Text("Count: \(viewModel.count)")
      Button("Tap me") {
        viewModel.increment()
      }
    }
  }
}
medium
A. Count: 0
B. Count: Tap me
C. Count: 1
D. Count: nil

Solution

  1. Step 1: Understand initial state

    The count starts at 0 as declared in ViewModel.
  2. Step 2: Analyze button tap effect

    When tapped, increment() adds 1 to count, updating the published property.
  3. Final Answer:

    Count: 1 -> Option C
  4. Quick Check:

    Button tap increments count to 1 [OK]
Hint: Button tap calls increment, count updates [OK]
Common Mistakes:
  • Assuming count stays 0 after tap
  • Confusing button label with count value
  • Expecting nil instead of initial 0
4. Identify the error in this ViewModel code snippet and how to fix it:
class UserViewModel {
  @Published var username: String = ""
  func updateName(newName: String) {
    username = newName
  }
}
medium
A. Missing ObservableObject conformance; add ': ObservableObject' to class
B. Cannot use @Published on String; change to Int
C. updateName should return String; add return type
D. username should be private; add 'private' keyword

Solution

  1. Step 1: Check @Published usage

    @Published requires the class to conform to ObservableObject to work properly.
  2. Step 2: Fix class declaration

    Add ': ObservableObject' after class name to enable property observation.
  3. Final Answer:

    Missing ObservableObject conformance; add ': ObservableObject' to class -> Option A
  4. Quick Check:

    @Published needs ObservableObject [OK]
Hint: Add ObservableObject to use @Published [OK]
Common Mistakes:
  • Forgetting ObservableObject conformance
  • Thinking @Published works without ObservableObject
  • Changing data type unnecessarily
5. You want to create a SwiftUI app using MVVM where the ViewModel fetches a list of users asynchronously and updates the View. Which approach correctly handles this scenario?
hard
A. Make ViewModel conform to ObservableObject, use @Published for users array, fetch data asynchronously and update @Published property
B. Fetch data directly in the View and update a local @State variable
C. Store users array in the Model only and let View read it directly
D. Use a global variable for users and update it from anywhere

Solution

  1. Step 1: Understand MVVM async data flow

    ViewModel should handle data fetching and update @Published properties to notify View.
  2. Step 2: Evaluate options

    Make ViewModel conform to ObservableObject, use @Published for users array, fetch data asynchronously and update @Published property correctly uses ObservableObject and @Published with async fetch; others break MVVM or cause bad design.
  3. Final Answer:

    Make ViewModel conform to ObservableObject, use @Published for users array, fetch data asynchronously and update @Published property -> Option A
  4. Quick Check:

    Async fetch in ViewModel updates @Published [OK]
Hint: Async fetch in ViewModel updates @Published property [OK]
Common Mistakes:
  • Fetching data in View instead of ViewModel
  • Using global variables for state
  • Letting View read Model data directly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard