SwiftUI — @Published

Jullian Mercier
2 min readNov 17, 2019

The @Published attribute is a property wrapper that allows access to a Publisher type using either the `$` syntax or the projectedValue struct property.

@propertyWrapper public struct Published<Value> {    /// Initialize the storage of the Published property as well as 
the corresponding `Publisher`.
public init(initialValue: Value) {…} /// The property that can be accessed with the `$` syntax and
allows access to the `Publisher`
public var projectedValue: Published<Value>.Publisher { mutating
get }
}

A class using a @Published attribute must conform to the ObservableObject protocol — part of the Combine framework — which « synthesizes an objectWillChange publisher that emits the changed value before any of its @Published properties changes ».

Under the hood, the `objectWillChange` publisher will receive a new input whenever one of a @Published property is about to be mutated.

@Published works well with SwiftUI — coupled with a MVVM architecture — as one can make a view model conform the ObservableObject and mark its underlying properties as @Published so that views always reflect the latest model changes.

Creating a `ViewModel` class conforming to the ObservableObject enables us to work with a @Published property and process its underlying publisher.

class ViewModel: ObservableObject {    @Published var keyword = ""    func processKeyword() {
self.$keyword // or self._keyword.projectedValue
.debounce(for: 0.5, scheduler: DispatchQueue.main)
.sink { self.sortArticles(byKeyword: $0) }
.store(in: &cancellable)
}
}

The `sink` method creates a subscriber and immediately receive values from the upstream publisher enabling us to sort the articles by keyword.

Notice how the `$` syntax or `projectedValue` property from @Published is similar to the @State ones however both provide with different types — respectively a Publisher type and a Binding type — .

Because SwiftUI and Combine are tightly related, views observing these @Published properties will actually react to any new values emitted by their underlying publishers through the `objectWillChange` synthetizer.

— Conclusion

The @Published attribute is a great means of communication between the UI and its related data as one can observe a model object and reflect the UI with its latest changes.

It works well with the MVVM architecture as it enables us to observe the underlying stored properties through a publisher.

When conforming to the ObservableObject protocol, the system automatically synthesizes an `objectWillChange` publisher which will listen to the @Published properties mutations and send the information back to a view.

Follow me on Twitter for my latest articles.

--

--