Published Event

A simple property wrapper over PassthroughSubject to create publishable properties that don’t emit value right after subscription.

? Installation

Add PublishedEvent directory from this repository into your project and that’s it!

? How to use

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 = ()

GitHub

View Github