@Published properties help your app update the screen automatically when data changes. This means you don't have to write extra code to refresh the view.
@Published properties in iOS Swift
class MyModel: ObservableObject { @Published var myValue: String = "" }
The class must conform to ObservableObject to use @Published.
Properties marked with @Published automatically notify views when they change.
count when it changes.class Counter: ObservableObject { @Published var count: Int = 0 }
@Published properties can be used in one class to track different pieces of data.class UserSettings: ObservableObject { @Published var username: String = "Guest" @Published var isLoggedIn: Bool = false }
class EmptyModel: ObservableObject { @Published var text: String = "" }
This app shows a number that increases every second after you press the button. The @Published property secondsElapsed updates the text automatically.
import SwiftUI class TimerModel: ObservableObject { @Published var secondsElapsed: Int = 0 func startTimer() { Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in self?.secondsElapsed += 1 } } } struct ContentView: View { @StateObject private var timerModel = TimerModel() var body: some View { VStack { Text("Seconds: \(timerModel.secondsElapsed)") .font(.largeTitle) .padding() Button("Start Timer") { timerModel.startTimer() } .padding() } } } @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } } }
Time complexity: Updating a @Published property is very fast, just a simple value change.
Space complexity: Minimal extra memory is used for the publisher behind the scenes.
Common mistake: Forgetting to mark the class as ObservableObject or forgetting to use @StateObject or @ObservedObject in the view to watch the changes.
Use @Published when you want automatic UI updates. Use manual updates only if you need more control.
@Published makes properties send updates automatically.
Use it inside classes that conform to ObservableObject.
It helps keep your UI in sync with your data easily.
Practice
@Published in SwiftUI?Solution
Step 1: Understand @Published role
@Published marks a property to send updates when its value changes.Step 2: Connect to UI updates
This automatic notification helps SwiftUI views update when data changes.Final Answer:
To automatically notify views when the property changes -> Option CQuick Check:
@Published = automatic update notification [OK]
- Thinking @Published makes property private
- Confusing @Published with constant declaration
- Assuming @Published saves data permanently
@Published property inside an ObservableObject class?Solution
Step 1: Check class and ObservableObject conformance
@Published must be inside a class conforming to ObservableObject, so class Model: ObservableObject is correct.Step 2: Verify property declaration syntax
The correct syntax is @Published var count: Int = 0, not var count: @Published Int.Final Answer:
class Model: ObservableObject { @Published var count: Int = 0 } -> Option BQuick Check:
Correct syntax = class Model: ObservableObject { @Published var count: Int = 0 } [OK]
- Using struct instead of class for ObservableObject
- Placing @Published after the type
- Not conforming class to ObservableObject
model.count = 5 is executed?
class Model: ObservableObject {
@Published var count: Int = 0
}
let model = Model()
model.$count.sink { print("Count changed to \($0)") }Solution
Step 1: Understand @Published publisher
@Published creates a publisher accessible via $property, here $count, which emits new values on change.Step 2: Analyze sink subscription and assignment
The sink closure prints the new value when count changes. Setting model.count = 5 triggers the print with 5.Final Answer:
Count changed to 5 -> Option AQuick Check:
@Published publishes new values = Count changed to 5 [OK]
- Expecting output before assignment
- Confusing $count with count
- Thinking no output without explicit call
class Model: ObservableObject {
@Published var name: String
init() {
name = ""
}
}
let model = Model()
model.name = "Alice"Solution
Step 1: Check @Published property initialization
The property name is initialized in init(), which is valid for non-optional properties.Step 2: Verify ObservableObject conformance and usage
Class conforms to ObservableObject and property is assigned outside class, which is allowed.Final Answer:
No error, code works fine -> Option AQuick Check:
Proper init and conformance = No error, code works fine [OK]
- Assuming @Published needs default value inline
- Thinking ObservableObject conformance is missing
- Believing external assignment is disallowed
@Published property updates a label text automatically. Which of the following is the best way to connect the @Published property to the UI?Solution
Step 1: Understand property wrappers for UI updates
@Published properties notify changes, but the view must observe the object using @ObservedObject to update UI automatically.Step 2: Evaluate other options
@State is for local view state, not external objects; setNeedsDisplay() is UIKit, not SwiftUI; @EnvironmentObject requires injection.Final Answer:
Use @ObservedObject in the view to watch the ObservableObject -> Option DQuick Check:
@Published + @ObservedObject = auto UI update [OK]
- Using @State instead of @ObservedObject for external data
- Trying manual UI refresh calls in SwiftUI
- Using @EnvironmentObject without proper injection
Ready to prove it?
Pass the test and this pattern moves unknown
