A simple property wrapper over PassthroughSubject
to create publishable properties that don't emit value right after subscription.
Add PublishedEvent
directory from this repository into your project and that's it!
The following example show how to declare Event variable and subscribe on it.
❗️ Pay attention that even though value has optional type on declaration, it is not optional in subscription!
/// Declaration
/// Make it `private(set)` to restrict changing value outside of the class
@Event private(set) var updateStringEvent: String?
/// Subscription
/// This subscription won't emit right after subscription as `PassthroughSubject` does.
subscription = $updateStringEvent.sink { value in
// Value is not optional!
print("New value is \(value)")
}
/// Emit value
updateStringEvent = "I love publishers 😍"
It was the example with usual data. But how to declare Event with optional data type? Things are simple - just add the second optional 🙃
/// Declaration
/// Make it double-optional to get optional value in subscription
@Event private(set) var updateStringEvent: String??
/// Subscription
subscription = $updateStringEvent.sink { value in
if let value = value {
print("New value is \(value)")
} else {
print("New value is null")
}
}
/// Emit value
updateStringEvent = nil // or some string value
And the last example, how to use it if we want to just emit some event, without value. The answer is - just make the Void type!
/// Declaration
@Event private(set) var dataLoadedEvent: Void?
/// Subscription
subscription = $dataLoadedEvent.sink {
print("Data was loaded")
}
/// Emit value
updateStringEvent = ()